ActionListener und Singleton

tobi193

Aktives Mitglied
Hallo,

ich habe hier ein Problem mit dem ActionListener. Und zwar wird die actionPerformed Methode nicht aufgerufen. Da mein Quellcode etwas zu kompliziert ist um ihn hier zu zeigen, habe ich das ganze vereinfacht mal nachgebaut. Auch in der simplen Fassung funktioniert es nicht:

Java:
public class GUI extends JFrame{
    public GUI(){
        super("bla");
        JButton bu = new JButton("BLUBB");
        bu.addActionListener(Test.getInstance());
        this.add(bu);
        this.setVisible(true);
    }
}




public class Test implements ActionListener{

    private static Test instance = new Test();
    private GUI gui = new GUI();

    private Test(){

    }

    public static void main(String[] args){
        Test.getInstance();
    }

    public static Test getInstance(){
        return instance;
    }

    public void actionPerformed(ActionEvent e) {
       System.out.println("bla");
    }
}

Bei einem Buttonclick passiert einfach nichts ("bla" wird nicht ausgegeben). Woran liegt das ?

Vielen Dank für eure Hilfe !
 

dehlen

Bekanntes Mitglied
soweit ich das beurteilen kann (nur vermutung) muss
Code:
public class Test implements ActionListener{
hinter diese Zeile die action performed Methode
 

z-mon

Bekanntes Mitglied
Also der Code sieht soweit ok aus. Konnte ihn auch ohne weiteres compilieren (die Sichtbarkeit des Fensters muss natürlich noch gesetzt sein).

Bekommst du auch keine Fehlermeldung oder ähnliches?
 

eRaaaa

Top Contributor
Java:
bu.addActionListener(Test.getInstance());

Code:
instance
ist null!
Mache mal
Code:
 GUI gui
auch static , wobei das alles etwas merkwürdig verdrahtet ist :)
 

z-mon

Bekanntes Mitglied
Vom Prinzip sollte deine Geschichte eigentlich in etwa so aussehen:

Java:
public class GUI extends JFrame{
    public GUI(){
        JButton bu = new JButton("BLUBB");
        bu.addActionListener(new Test());
        add(bu);
        pack();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    
    public static void main(String[] args) {
		new GUI();
	}
}
 
 
class Test implements ActionListener{
	public void actionPerformed(ActionEvent e) {
		System.out.println("blubb");
	}
}
 

tobi193

Aktives Mitglied
@ z-mon: Klar, das ist natürlich die einfachste Möglichkeit, aber ich benötige eben die Klasse "Test" als Singleton. Wie gesagt ist das Beispiel nur ein (stark) vereinfachter Code aus meinem eigentlichen Programm.

@ eRaaaa: Mit static scheint es im Beispiel zu funktionieren (bei richtiger Beachtung der Reihenfolge bei der Initialisierung. Das werde ich gleich mal im eigentlichen Programm ausprobieren.
 

tfa

Top Contributor
Bei einem Buttonclick passiert einfach nichts ("bla" wird nicht ausgegeben). Woran liegt das ?
Einen netten Bug hast du da produziert. Die Initialisierung und der "Start" des Programms durch die gui-Membervariable in Test ist auch wirklich kompliziert und ungeschickt.

Und versuche um Himmels willen dieses Singleton weg zu kriegen. Die sind auf 100 Arten gefährlich und als ActionListener braucht man sie garantiert nicht.
 

tobi193

Aktives Mitglied
Ja, ich habe mich total verwurstelt.

Mein Programm ist in etwa so aufgebaut:

GUI - Oberfläche

Controller - alle steuernden Geschichten

Client - Netzwerkverbindung

Bis vor kurzem hatte ich die GUI und den Controller in einer Klasse. Aber bei zunehmender Komplexität ist das sehr unsauber und unübersichtlich. Daher muss getrennt werden. Aber daran scheitert es nun.
Ich habe in der GUI einige Buttons auf die ein ActionListener registriert ist sowie mehrere Labels, welche von einem Thread im Controller ständig bearbeitet werden.
Somit habe ich gegenseitige Beziehungen, welche ich irgendwie nicht gelöst bekomme.

Wie baue ich jetzt das ganze optimal auf ? Mit der Singletonvariante wohl nicht.
 

z-mon

Bekanntes Mitglied
Mal so eine Frage am Rande .. weißt du eigentlich was genau ein Singleton ist und zu welchem Zweck es eingesetzt wird? :confused:
 

tfa

Top Contributor
In der Controller-Klasse definierst du für jeden Button ein Modell (z.B. DefaultButtonModel oder auch einfach nur ein ActionListener). Dieses Modell bindest du bei der Initialisierung des GUI-Objektes an den betreffenden Button.
Ungefähr so:
Java:
public class Gui {
	
	public Gui(Controller ctrl) {
		getOkButton().setModel(ctrl.getOkButtonModel());
	}
}

public class Controller {
	
	private DefaultButtonModel okButtonModel;
	
	public DefaultButtonModel getOkButtonModel() {
		if (okButtonModel==null) {
			okButtonModel = new DefaultButtonModel();
			okButtonModel.addActionListener(new ActionListener() {
				
				public void actionPerformed(ActionEvent e) {
					okButtonPressed();
				}
			});
		}
	}
}
Das wäre eine ganz einfache Möglichkeit.
 

tagedieb

Top Contributor
Da hast du ein nettes kleines Problem konstruiert ;-)

Die Loesung duerfte jetzt inzwischen klar sein.
Das Problem hat nichts mit Swing/AWT zu tun sondern mit 'Concurrency'.
Du musst umbedingt darauf achten, dass du deine Objekte erst VOLLSTAENDIG initialisiert bevor du sie benutzt (publizierst).
Ansonsten ist das Ergebnis unvorhersehbar wenn du mit halb initialisierten Objekten arbeitest!!

Versuche auch bidirektionale Beziehungen zu vermeiden, dann ist der Code gleich viel verstaendlicher und erhoeht die Erweiterbarkeit deiner Software.
 

tagedieb

Top Contributor
Nö. Hier gab es ja nur einen Thread.

Da sieht man mal wieder, dass nicht mal ein eiziger Thread threadsafe ist ;-)
Recht hast du - es geht um die Initialisierung von Objekten. Habs im Concurrency Handbuch nachgeschlagen, deshalb ist das hier reingerutscht.
 

Tente

Mitglied
Jap Initialisierungsfehler. Mach den getter lazy und die instanz threadsafe, dann sollte es gehen:

Java:
public class GUI extends JFrame{
    public GUI(){
        super("bla");
        JButton bu = new JButton("BLUBB");
        bu.addActionListener(Test.getInstance());
        this.add(bu);
        this.setVisible(true);
    }

   public static void main(String args[]){
        new GUI();
   }
}
 

 
 
public class Test implements ActionListener{
 
    private static volatile Test instance;
     
    private Test(){
 
    }
 
    public static Test getInstance(){
        if(instance == null)
            instance = new Test();
        return instance;
    }
 
    public void actionPerformed(ActionEvent e) {
       System.out.println("bla");
    }
}

Nicht getestet, sollte aber funktionieren. Und du hast dein Singleton....
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JButton und ActionListener Allgemeine Java-Themen 3
F System Tray Menubutton ActionListener Allgemeine Java-Themen 5
V Event Handling ActionListener nur bei "checked" CheckBoxMenuItem Allgemeine Java-Themen 2
K Best Practice Auf die Klasse zugreifen im erzeugten ActionListener Allgemeine Java-Themen 2
S Methode funktioniert nicht als ActionListener Allgemeine Java-Themen 4
C ActionListener - ToggleButton als von KI geklickt "markieren" Allgemeine Java-Themen 2
A ActionListener blockiert Bedienung des ganzen Systems Allgemeine Java-Themen 8
Z Swing Problem mit ActionListener Allgemeine Java-Themen 6
X getText undefiniert in ActionListener Allgemeine Java-Themen 5
D ActionListener wird mit jedem Mal öfter aufgerufen Allgemeine Java-Themen 2
P Variablen Variable von void im ActionListener verwenden Allgemeine Java-Themen 3
F Swing NetBeans nimmt ActionListener nicht an. Allgemeine Java-Themen 2
C Event Handling ActionListener manuell auslösen Allgemeine Java-Themen 8
G Button-Registrierung beim ActionListener erst NACH Tastendruck Allgemeine Java-Themen 2
P ActionListener / Label Name auslesen Allgemeine Java-Themen 2
C ActionListener zwei Buttons zuweisen Allgemeine Java-Themen 11
J ActionListener-Klasse will Methode nicht annehmen Allgemeine Java-Themen 6
G Übergabeparameter an ActionListener Allgemeine Java-Themen 9
Z Mit ActionListener in anderem Frame lauschen? Allgemeine Java-Themen 3
W 2 Klassen + ActionListener Allgemeine Java-Themen 2
G Anonymen Buttons in for schleife ActionListener hinzufügen Allgemeine Java-Themen 5
C JTree: ActionListener auf die Nodes Allgemeine Java-Themen 3
C ActionListener reagiert zu oft Allgemeine Java-Themen 5
MQue ActionListener und GUI trennen Allgemeine Java-Themen 3
L ActionListener / Buttons Allgemeine Java-Themen 8
E ActionListener Allgemeine Java-Themen 8
TheJavaKid Programmablauf anhalten bis actionlistener ausgeführt wurde Allgemeine Java-Themen 6
minzel ActionListener aus Package Allgemeine Java-Themen 24
F AbstractAction und ActionListener Allgemeine Java-Themen 2
J variablen wert ändernung mit einer art actionlistener? Allgemeine Java-Themen 4
K ActionListener ohne implements? Allgemeine Java-Themen 2
L ActionListener > Variable ... u.v.m. Allgemeine Java-Themen 19
W ActionListener + Klasse einbinden Allgemeine Java-Themen 2
EinNickname9 Best Practice Singleton und Singleton mit Instanz zu anderer Klasse -Pattern Allgemeine Java-Themen 30
Neoline Klassen Singleton Klasse buchmanager Allgemeine Java-Themen 19
J Singleton Allgemeine Java-Themen 5
Z deserialize singleton Allgemeine Java-Themen 9
A Singleton threadsafe Allgemeine Java-Themen 8
S Singleton Instanz löschen Allgemeine Java-Themen 5
A Datei als Object einlesen und das Object als Singleton instance setzen. Allgemeine Java-Themen 13
S Singleton Entwurfsmuster Allgemeine Java-Themen 20
T So eine Art Singleton-Factory? Allgemeine Java-Themen 3
S Singleton-Klasse und ThreadLocal-Klasse von abstrakter Klasse ableiten? Allgemeine Java-Themen 2
S Singleton hier sinnvol? Allgemeine Java-Themen 20
T Zugriff auf Singleton verkürzen - Namespaces?? Allgemeine Java-Themen 20
B Volatile Frage: Reicht es nur den Singleton als volatile zu deklarieren? Allgemeine Java-Themen 4
Iron Monkey Singleton mit Parameter Allgemeine Java-Themen 14
G Singleton Frage: Allgemeine Java-Themen 17
M Singleton und Vererbung? Allgemeine Java-Themen 45
R Wo initilisiere ich eine Liste in einem Singleton? Allgemeine Java-Themen 2
M Java Garbage Collector Frage (Singleton Pattern) Allgemeine Java-Themen 13
B Generisches Singleton implementieren Allgemeine Java-Themen 12
H Singleton und MultiThreading [erledigt] Allgemeine Java-Themen 3
S Singleton Pattern mit Generics Allgemeine Java-Themen 4
P SingleTon Allgemeine Java-Themen 5
M zwei Threads - ein singleton-Objekt Allgemeine Java-Themen 3
RaoulDuke Agent als Singleton Thread Allgemeine Java-Themen 7
S singleton vs. static Allgemeine Java-Themen 7
P Singleton vs static Allgemeine Java-Themen 19
K Singleton vererben Allgemeine Java-Themen 15
E Singleton vererben Allgemeine Java-Themen 10
E Frage zu Singleton Allgemeine Java-Themen 22
D Design Pattern: Singleton Allgemeine Java-Themen 4
K Sequenzdiagramm für Singleton-Muster Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben