alioooopMedlem sedan feb. 2008120 inlägg hej :)
är relativt ny inom java så detta är säkert en väldigt lätt fråga :)
håller på med en twitterklient där jag använder mig utav den färdiga classen Jtwitter.
i public static void main har jag skapat en instans av classen twitter från JTwitter och vill nu när jag trycker på en knapp i huvudapplicationen (knappen finns i public static void main den också) så vill jag anropa en actionlistener som i sin tur anropar en funktion i min tidigare skapade instans av twitter.
från min nuvarande actionlistener kommer jag inte åt twitter för tillfället.
hur ska jag få detta att funka? visst borde ju gå skapa en ny instans inne i actionlistenern men kändes väldigt onödigt...
MVH Alioooop
Du bör lägga all kod i en instans av din klass, och bara använda main för att skapa en instans av klassen. main ska inte ses som mer än en hjälpfunktion.
Dessutom kan du använda samma instans av din klass för att lyssna efter knapptryckningar. Genom att använda evt.getSource() och jämföra kan du använda samma funktion till flera knappar. (Notera button.addActionListener(this);)
Typ:
class MinTwitterApplikation implements ActionListener{
public static void main(String[]args){
new MinTwitterApplikation(); // Skapa en instans av din applikation
}
JTwitter twitter;
JButton button1,button2;
public MinTwitterApplikation(){ // Din konstruktor
twitter = new JTwitter();
button1 = new JButton();
button2 = new JButton();
button1.addActionListener(this);
button2.addActionListener(this);
}
public void actionPerformed(ActionEvent evt){ //
if (evt.getSource() == button1){
twitter.doSomething();
}
if (evt.getSource() == button2){
twitter.doSomethingElse();
}
}
}
Alternativ metod med inline-definitioner av dina ActionListeners. Notera att första klassen implements ActionListener medan den andra inte gör det. Detta pga att i det första exemplet används en instans av klassen själv som ActionListener-objekt. I det andra exemplet objekt "inline" i koden.
class MinTwitterApplikation{
public static void main(String[]args){
new MinTwitterApplikation(); // Skapa en instans av din applikation
}
JTwitter twitter;
JButton button1,button2;
public MinTwitterApplikation(){ // Din konstruktor
twitter = new JTwitter();
button1 = new JButton();
button2 = new JButton();
button1.addActionListener(new Actionlistener(){
public void actionPerformed(ActionEvent evt){
twitter.doSomething();
}
});
button2.addActionListener(new Actionlistener(){
public void actionPerformed(ActionEvent evt){
twitter.doSomethingElse();
}
});
}
}
ercizMedlem sedan maj 20011 826 inlägg nitro2k01 gav ett bra svar, här kommer ett alternativt.
gör din Twitter till final så borde nåt i den här stilen funka:
final Twitter twitter = new Twitter(...
JButton button = new JButton(...
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
twitter.getStatus(...
});
final gör ingen som helst skillnad i detta fall. Om man ska göra allt i main måste däremot twitter-objektet antingen deklareras inuti main eller som static om det definieras ute i klassen.
Att använda en inline-listener bör däremot fungera utmärkt i main, oavsett hur twitter-objektet definierades innan. (Under förutsättning att koden kompilerade utan fel tidigare.)
Dock måste man lära sig skillnad mellan static- och instansvariabler, annars ter sig många saker i Java smått skumma. (Det som är definierat som static finns bara i ett exemplar, oavsett hur många objekt du skapar. Instansvariabler finns däremot i en kopia per objekt av en viss klass.)
final agerar helt oberoende av om saker är static eller instans, det gör bara att en variabel inte kan ändras när den är satt.
ercizMedlem sedan maj 20011 826 inlägg
nitro2k01 skrev:
final gör ingen som helst skillnad i detta fall.
Jo, mitt exempel fungerar inte om inte Twitter är final, eftersom det ska användas i new ActionListener().
Hmm, jag testade och du har faktiskt rätt.