Kom-pa-TI-bilitet
Lite hjälp med ActionListener i Java.
Visa signatur
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:
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:
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.
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?
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.
Kom-pa-TI-bilitet
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.
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 (..?))
Kom-pa-TI-bilitet
Tack! Nu funkar det
Copyright © 1999–2024 Geeks AB. Allt innehåll tillhör Geeks AB.
Citering är tillåten om källan anges.