webForumDet fria alternativet

java jbutton problem

Java

5 svar · 737 visningar · startad av alioooop

Medlem sedan feb. 2008120 inlägg
Frågan#1

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

Medlem sedan aug. 20039 340 inlägg
#2

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();
            }
        });
    }
}
Medlem sedan maj 20011 826 inlägg
#3

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(...
});
Medlem sedan aug. 20039 340 inlägg
#4

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.

Medlem sedan maj 20011 826 inlägg
#5

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

Medlem sedan aug. 20039 340 inlägg
#6

Hmm, jag testade och du har faktiskt rätt.

269 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
118 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)