Lite hjälp med ActionListener i Java.

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Sep 2003

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.

| Opteron 165 @ 2810MHz | DFI Lanparty UT NF4 Ultra-D | 2x1024MB TwinMOS PC3200 DDR |
| Sapphire Radeon X800GTO² @ 16p, 533/627 | 3DMark05: XXXXp | 3DMark01: XXXXXp |
| 150GB Raptor + 120GB + 2x200GB + 2x250GB + 2x320GB + 500GB | Totalt: 2,31TB |

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

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.

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Sep 2003

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.

| Opteron 165 @ 2810MHz | DFI Lanparty UT NF4 Ultra-D | 2x1024MB TwinMOS PC3200 DDR |
| Sapphire Radeon X800GTO² @ 16p, 533/627 | 3DMark05: XXXXp | 3DMark01: XXXXXp |
| 150GB Raptor + 120GB + 2x200GB + 2x250GB + 2x320GB + 500GB | Totalt: 2,31TB |

Trädvy Permalänk
Medlem
Plats
i din garderob
Registrerad
Sep 2007

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 (..?))

Bilanaloger är som Volvo — varenda svenne kör med dem

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Sep 2003

Tack! Nu funkar det

| Opteron 165 @ 2810MHz | DFI Lanparty UT NF4 Ultra-D | 2x1024MB TwinMOS PC3200 DDR |
| Sapphire Radeon X800GTO² @ 16p, 533/627 | 3DMark05: XXXXp | 3DMark01: XXXXXp |
| 150GB Raptor + 120GB + 2x200GB + 2x250GB + 2x320GB + 500GB | Totalt: 2,31TB |