Lite hjälp med ActionListener i Java.

Permalänk
Medlem

Lite hjälp med ActionListener i Java.

Jag har ett fält med egenskapade objekt i form av JButtons som jag i en for-loop "addar" ut till GUI:t ungefär så här:

Citat:

for(Objekt mittObjekt : allaObjekt) {
add(mittObjekt);
}

Om jag sedan vill ha en "public void actionPerformed(ActionEvent event)" längst ner, hur gör det lättast då att referera till just det objektet? Att lägga till mittObjekt.addActionListener(this) och sedan försöka med event.getSource() får jag inte till alls.
Efter lite googlande och sökande här lyckades jag få till det som jag ville, dock inte på det sättet, så jag undrar fortfarande om det går så som jag vill ovan?

Detta är hur jag löst det nu:

Citat:

for(final Objekt mittObjekt : allaObjekt) {
add(mittObjekt);
mittObjekt.addActionListener(new ActionListener() {
//Koden som ska köras
});
}

Sen undrar jag, varför måste jag köra final där också? Ville inte funka innan.

Sen när jag ändå är i farten kan jag fråga en annan grej, det där med Container, är det något jag måste lägga till? Får fram det grafiska nu som jag vill, dock utan Container. Bara med en klass som "extends" JFrame.

Permalänk
Medlem

Re: Lite hjälp med ActionListener i Java.

Citat:

Ursprungligen inskrivet av ChRiiLLe

Om jag sedan vill ha en "public void actionPerformed(ActionEvent event)" längst ner, hur gör det lättast då att referera till just det objektet? Att lägga till mittObjekt.addActionListener(this) och sedan försöka med event.getSource() får jag inte till alls.

Det borde fungera tycker jag. Castar du event.getSource() till JButton?

Citat:

Ursprungligen inskrivet av ChRiiLLe

Sen när jag ändå är i farten kan jag fråga en annan grej, det där med Container, är det något jag måste lägga till? Får fram det grafiska nu som jag vill, dock utan Container. Bara med en klass som "extends" JFrame.

Container är en superklass som kan innehålla komponenter. JPanel är t ex en Container längre ner (eller blir det upp..?) i hiearkin.

JFrame.add(foo) är en bekvämlighetsmetod för JFrame.getContentPane().add(foo), där getContentPane() returnerar ett objekt deriverat från Container.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Re: Re: Lite hjälp med ActionListener i Java.

Citat:

Ursprungligen inskrivet av Teknocide
Det borde fungera tycker jag. Castar du event.getSource() till JButton?

Hur menar du med Castar?

Problemet är nog att jag inte vet hur jag ska kolla "vilket" objekt som är tryckt på.
Att skriva event.getSource() == mittObjekt funkar ju inte då det kan vara allt från 2-16 objekt i mitt fall, dock så vill jag att samma metod ska köras för det aktuella objektet oberoende av vilket där är. mittObjekt.görDetHär() ungefär för det aktiva och inget annat.

Permalänk
Medlem

Re: Re: Re: Lite hjälp med ActionListener i Java.

Citat:

Ursprungligen inskrivet av ChRiiLLe
Hur menar du med Castar?

Problemet är nog att jag inte vet hur jag ska kolla "vilket" objekt som är tryckt på.
Att skriva event.getSource() == mittObjekt funkar ju inte då det kan vara allt från 2-16 objekt i mitt fall, dock så vill jag att samma metod ska köras för det aktuella objektet oberoende av vilket där är. mittObjekt.görDetHär() ungefär för det aktiva och inget annat.

public void actionPerformed(ActionEvent e) { JButton source = (JButton)e.getSource(); // "source" är nu en direktreferens till den JButton som triggade eventet doSomething(source); } private void doSomething(JButton b) { b.setText("KLICK!"); // sätter text på knapp 'b' till "KLICK!" }

Ett alternativ du har är att använda get/setActionCommand() för att skicka med en textsträng i eventet.

public void actionPerformed(ActionEvent e) { String command = e.getActionCommand(); if (command.equals("BUTTON1")) { doSomethingVital(); } else if (command.equals("BUTTON2")) { doSomethingUnimportant(); } else { doSomethingElse(); } }

För det sista exemplet ska du använda setActionCommand(<en sträng>) på dina knappar, förslagsvis i samband med att de skapas. Använd gärna något i stil med public static final String AC_BUTTON1 = "BUTTON1"; så att du kan testa direkt mot den konstanta variabeln (i stil med command.equals(AC_BUTTON1))

(note to self, det fungerar antagligen i detta fall lika bra med att göra en rak jämförelse, command == AC_BUTTON1, eftersom en konstant har angivits i alla lägen. Såvida inte setActionCommand gör en kopia av den sträng man matar in i den (..?))

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem

Tack! Nu funkar det