[Java]Waarom kan ActionEvent.getSource() niet in een switch?

Pagina: 1
Acties:

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Waar mag dit niet: (geeft incompatible types)? En hoe kan ik het alsnog wél met een switch oplossen?
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public void actionPerformed(ActionEvent e)
    {       
        switch(e.getSource())
        {
            case b1:
            l1.setText("Dit was button 1");
            break;
            
            case b2:
            l1.setText("Dit was button 2");
            break;
            
            case b3:
            l1.setText("Dit was button 3");
            break;
            
        }   
    }


en dit wel:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == b1)
        {
            l1.setText("Dit was button 1");
        }
        
        if(e.getSource() == b2)
        {
            l1.setText("Dit was button 2");
        }
        
        if(e.getSource() == b3)
        {
            l1.setText(" ");
        }
        
    }


alvast bedankt

  • momania
  • Registratie: Mei 2000
  • Laatst online: 08:56

momania

iPhone 30! Bam!

Switch mag alleen met int's of enumerated types:
http://java.sun.com/docs/.../nutsandbolts/switch.html

En dus niet met een Object wat getSource() je geeft. ;)

Neem je whisky mee, is het te weinig... *zucht*


  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
Daar zat ik laatst ook mee, precies met die getSource(). Vind ik wel een erg jammerlijke tekortkoming van Java.

Noushka's Magnificent Dream | Unity


  • André
  • Registratie: Maart 2002
  • Laatst online: 15-04 09:54

André

Analytics dude

Michali schreef op zondag 18 december 2005 @ 13:12:
Daar zat ik laatst ook mee, precies met die getSource(). Vind ik wel een erg jammerlijke tekortkoming van Java.
getSource().toString() :?

Of kan dat niet?

  • momania
  • Registratie: Mei 2000
  • Laatst online: 08:56

momania

iPhone 30! Bam!

als je toch een indicatie wilt hebben welke knop je hebt gebruikt, kan je beter de actionCommand vullen en die gebruiken.

Als je daar een integer waarde in propt of een enumerated type, kan je dus wel de switch gebruiken.

Beter is nog om met simpele private action listeners te werken.

Neem je whisky mee, is het te weinig... *zucht*


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
momania schreef op zondag 18 december 2005 @ 13:01:
Switch mag alleen met int's of enumerated types:
http://java.sun.com/docs/.../nutsandbolts/switch.html

En dus niet met een Object wat getSource() je geeft. ;)
Kan ik van dat object geen String maken? Ik moet alleen de naam van het Object the weten om te checken welke button er gebruikt is.

@André: werkt helaas niet.

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
André schreef op zondag 18 december 2005 @ 13:16:
[...]

getSource().toString() :?

Of kan dat niet?
Volgens mij is een string ook niet toegestaan. Alleen ints en enumerated types (wat intern ook gewoon ints zijn denk ik).

Noushka's Magnificent Dream | Unity


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

André schreef op zondag 18 december 2005 @ 13:16:
getSource().toString() :?

Of kan dat niet?
Strings werken in Java niet in een switch. :)

Your1: je weet trouwens toch wel betere topictitels te verzinnen dan "java vraagje"? :? Titelfix dus. :)

[ Voor 22% gewijzigd door NMe op 18-12-2005 13:21 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
momania schreef op zondag 18 december 2005 @ 13:17:
als je toch een indicatie wilt hebben welke knop je hebt gebruikt, kan je beter de actionCommand vullen en die gebruiken.

Als je daar een integer waarde in propt of een enumerated type, kan je dus wel de switch gebruiken.

Beter is nog om met simpele private action listeners te werken.
Ik snap dat het OO gezien een stuk beter kan, maar ik ben nog maar een beginnende java progger.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Y0ur1 schreef op zondag 18 december 2005 @ 13:20:
[...]


Ik snap dat het OO gezien een stuk beter kan, maar ik ben nog maar een beginnende java progger.
Dus jij kan het nog goed aanleren ;)

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
kenneth schreef op zondag 18 december 2005 @ 13:28:
[...]
Dus jij kan het nog goed aanleren ;)
Jup maar het gaat nu voornamelijk even om de syntax en de beginselen van OO binnen java.

@NMe: je hebt gelijk, zal het volgende keer beter doen!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 15-04 22:07

NMe

Quia Ego Sic Dico.

Y0ur1 schreef op zondag 18 december 2005 @ 14:06:
Jup maar het gaat nu voornamelijk even om de syntax en de beginselen van OO binnen java.
Daar ging het toch ook over? ;)
@NMe: je hebt gelijk, zal het volgende keer beter doen!
d:)b

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • windancer
  • Registratie: Maart 2000
  • Laatst online: 19-04 17:02
Waarom zou de syntax van een taal iets moeten ondersteunen wat design technisch niet wenselijk is ?
Y0ur1 schreef op zondag 18 december 2005 @ 14:06:
[...]
Jup maar het gaat nu voornamelijk even om de syntax en de beginselen van OO binnen java.

@NMe: je hebt gelijk, zal het volgende keer beter doen!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Oke ik begrijp uit deze antwoorden dat het van het OO oogpunt niet de bedoeling is en dat het derhalve niet ondersteunt wordt. Bedankt voor de antwoorden.

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Y0ur1 schreef op zondag 18 december 2005 @ 12:58:

Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == b1)
        {
            l1.setText("Dit was button 1");
        }
        
        if(e.getSource() == b2)
        {
            l1.setText("Dit was button 2");
        }
        
        if(e.getSource() == b3)
        {
            l1.setText(" ");
        }
        
    }
Mag ik vragen waarom je 3x eenzelfde actionevent vraagt om zijn source? ;) Is 1x vragen niet genoeg? ;) i.e. Object source = e.getSource(); if (source == b1) etc..

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
prototype schreef op zondag 18 december 2005 @ 15:40:
[...]


Mag ik vragen waarom je 3x eenzelfde actionevent vraagt om zijn source? ;) Is 1x vragen niet genoeg? ;) i.e. Object source = e.getSource(); if (source == b1) etc..
Mag zeker, ik ben een beginnende java'er, dus dat zal het wel zijn :P

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Michali schreef op zondag 18 december 2005 @ 13:20:
Volgens mij is een string ook niet toegestaan. Alleen ints en enumerated types (wat intern ook gewoon ints zijn denk ik).
integers, enums en alles dat 'integer compatible' is en automatisch omgezet wordt: byte, short, char. In 1.5, dankzij autoboxing, ook de wrapper classes Integer, etc.

Wie trösten wir uns, die Mörder aller Mörder?


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21-04 13:55
Los van het feit dat je er geen objects mee kunt vergelijken, moeten je case-labels altijd constanten zijn. case 123: kan bijvoorbeeld, maar case a: niet, zelfs áls a gewoon een int is geen complex object.

Daarom alleen al werkt je aanpak niet. ;)

  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 07:53

M-ThijZ

Riding on Rails

Je moet jezelf afvragen wanneer een Object gelijk is aan elkaar.
Een String is ook gewoon een object, net als bijv. een Werknemer, een Fiets of een Auto.
Nu lijkt het bij een String wel logisch, maar wanneer is een Werknemer gelijk aan een andere Werknemer? Zelfde naam, adres of sofi nummer?
Simpelweg omdat een String een object is kun je het niet in een switch statement stoppen.

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

M-ThijZ schreef op zondag 18 december 2005 @ 17:54:
Simpelweg omdat een String een object is kun je het niet in een switch statement stoppen.
Te simpel, want er is nog altijd Obecjt.equals die iedere subklasse kan overriden.

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21-04 20:19

Robtimus

me Robtimus no like you

Soultaker schreef op zondag 18 december 2005 @ 17:03:
Los van het feit dat je er geen objects mee kunt vergelijken, moeten je case-labels altijd constanten zijn. case 123: kan bijvoorbeeld, maar case a: niet, zelfs áls a gewoon een int is geen complex object.

Daarom alleen al werkt je aanpak niet. ;)
Tenzij a is gedeclareerd als zijnde
Java:
1
final int a = <waarde>;
Of het dan een local final int is, een instance field of een static field maakt niet uit. Let er wel op dat de waarde er direct achter moet; eerst declareren en later initialiseren mag niet voor switch statements.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Daos
  • Registratie: Oktober 2004
  • Niet online
Een switch is een optimalisatie van de if als je meerdere ifs onder elkaar hebt. De implementatie van de switch zorgt ervoor dat dit (tot nu toe) alleen werkt met integers.

Om de werking enigszins te kunnen begijpen, moet je weten hoe een table-lookup werkt. Die werkt zo:
Java:
1
2
3
4
5
static String[] cijfer = {"nul", "een", "twee"};

static String getCijfer(int i) {
  return cijfer[i];
}

De i wordt gebruikt als index in de tabel. i moet dus een integer zijn of iets dat er op lijkt.
In een andere situatie kan het misschien zo zijn dat je een waarde zoals i moet transformeren naar een index. Ook kan het voorkomen dat een aantal elementen in de tabel leeg zijn.

De switch wordt ook zoiets in assembly. Het verschil tussen de normale table lookup en de switch is dat er met de switch code geselecteerd kan worden. Neem bijvoorbeeld:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
static int bereken(int op, int a, int b) {
  // op: 0 = optellen, 1 = aftrekken, 2 = keer, 3 = delen
  int z = 0;

  switch(op) {
    case 0: z = a + b; break;
    case 1: z = a - b; break;
    case 2: z = a * b; break;
    case 3: z = a / b;
  }
  
  return z;
}

Een compiler maakt hier meestal zoiets van:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
static adres[] tabel = {adres van lbl0, adres van lbl1, adres van lbl2, adres van lbl3};

static int bereken(int op, int a, int b) {
  int z = 0;
  goto tabel[op];
lbl0:
  z = a + b; goto end;
lbl1:
  z = a - b; goto end;
lbl2:
  z = a * b; goto end;
lbl3:
  z = a / b;
end:
  return z;
}

Een tabel bekijken gaat natuurlijk veel sneller dan een grote rij ifs aflopen.


In dit topic gaat het de hele tijd over de switch, maar de topicsstarter heeft helemaal geen switch nodig. De code blijft steeds hetzelfde. Alleen de data verandert. Een lookup-table is dus voldoende.

De normale lookup-table werkt (net als de switch) alleen met integers. Om dit werkend te krijgen kan je een integer-veld toevoegen aan je klassen/objecten die je kan gebruiken om de index te berekenen. Wat je ook kan doen is de java.util.HashMap gebruiken.

Voor 3 dingen gaat een rijtje ifs snel genoeg. Ik zou dat niet veranderen.


Zowiezo heb je de switch niet nodig in een goed OO programma. Neem bijvoorbeeld de bereken(int op, int a, int b) van hierboven. In de OO-versie heb je een abstracte klasse Expressie met een abstracte bereken(). Hiervan bestaan subklassen Constante, Optellen, Aftrekken, Keer en Delen. a en b zijn velden in die klassen en zijn van het type Expressie. De bereken() in Optellen ziet er bijvoorbeeld zo uit:
Java:
1
2
3
int bereken() {
  return a.bereken() + b.bereken();
}

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21-04 13:55
@Daos: volgens mij interpreteer je het voorbeeld van de topicstarter nu als zijn werkelijke situatie. Ik neem aan dat er hele andere dingen moeten gebeuren als er op een andere knop is gedrukt, dus een string uit een array halen is dan niet echt een optie.

Trouwens, als we het toch over implementatiedetails hebben: de Java compiler geneert alleen een tableswitch-instructie als het bereik een beetje beperkt is (misschien zelfs ook als het aantal cases ueberhaupt groot genoeg is; vanaf 4 ofzoiets). Als ik een switch-statement hebt met 1, 10, 100 en 1000 als cases, dan genereert 'ie dus gewoon dezelfde code als een serie van if/else-operaties.
Pagina: 1