Allgmeinen MouseListener für alle Elemente hinzufügen?

Angiii

Erfahrenes Mitglied
Hallo,

ich denke mein Problem ist nicht sehr kompliziert, nur die Umsetzung fällt mir im Moment noch schwer:

Ich habe ein GUI mit vielen Tabs, Panels, Schaltern, RadioButtons, etc. . Nun will ich für all diese Elemente einen identischen(!) MouseListener hinzufügen. Also egal auf welchen Button ich drücke - es soll immer das gleiche geschehen. Das Ganze dient als Überwachung ob das GUI gerade Funktionen ausführt oder nicht.

Die Funktion sieht im Moment so aus:
Code:
panelTab4.getZoomIn().addMouseListener(MouseAdapter() {   
			public void mousePressed(MouseEvent e) {
				zoomDirection = 0;
				zoom = new  ZoomThread();
				zoom.start();
			}
			public void mouseReleased(java.awt.event.MouseEvent e) {
				zoom.interrupt();
			}
});

Ich will jetzt nicht für jedes Element einen eigenen MouseListener einzeln hinzufügen. Gibt es nicht ein Codefragment, dass der MoueseListener automatisch für alle Buttons im GUI gilt?

Es würde auch ein allgemeiner, von den den Buttons unabhängiger MouseListener reichen. Also ein Funktion, die nur darauf achtet, ob die Maus gerade betätigt wird, oder nicht - egal wohin im GUI geklickt wurde. In verbindung mit den Buttons fände ich es aber noch zuverlässiger.

Ich hoffe Ihr könnt nachvollziehen, worauf ich hinaus will. Danke schonmal für alle Antworten!
 
Hallo.
So genau ist mir noch nicht klar, was das große Ziel ist. Ich interpretiere mal:
Du möchtest alle Aktionen die der Benutzer tätigen könnte überwachen, hinsichtlich ihres Verlaufs. Im Großen und Ganzen möchtest DU wie, Du geschrieben hast,.wissen, ob gerade eine Aktion durchgeführt wird?

Wenn ja:
Schaue Dir doch mal die Action (Tutorial) an. Wenn Du diese nicht nur implementierst sondern auch darin festhälst ob die Methode actionPerformed gerade aufgeführt wird, dann brauchst Du nur noch soetwas wie eine Management - Klasse die alle Actions in deiner Anwendung kennt. Diese Klasse kannst Du dann auch mit einer Methode ausstatten, die prüft, ob eine Action ausgeführt wird, oder nicht.

Aber so oder so. Ich halte es nicht für das beste Vorgehen, wenn du alle MouseAktionen abfängst, wenn Du dann nur einen Bruchteil der Events brauchst. Das kostet alles so seine Performance.
 
Hier mal die Hintergründe:

Ich habe ein Gerät, dass ich sowohl per Fernbedienung als auch per Internet (mein Java-Applet) steuern kann. Beide Optionen sollen gleichzeitig möglich sein. Jedoch kann die Kommunikationsleitung nur immer von einem Gerät genutzt werden.

Daher habe ich eine extra Leitung, die signaliersiert, ob das Java-Applet gerade Befehle sendet, oder nicht. Drückt der Benutzer gerade fleißig im Applet herum, hat die Fernbedienung sendepause. Macht der Benutzer nichts, darf auch die Fernbedienung senden. Das umschalten zwischen "darf" und "nicht darf" muss recht schnell gehen, damit der Nutzer nichts davon mitbekommt.

Bedingt durch meine Hardware, geschieht das setzen des "Darf" oder "Nicht darf"-Bits jedoch sehr langsam. Da ich Funktionen habe, die sehr oft hintereinander ausgeführt wird (wie bei JSlidern der Fall), soll das ganze abhänig von Mausklicks werden (-> klicken, halten, wieder loslassen). Solange ich dann auf der JSlider herumfahre, ist das Bit gesetzt, lasse ich die Maus los, ist es nicht mehr gesetzt. Dadurch muss nur 2 Mal was gesendet werden (daher der MouseListener).

Erste Tests funktionierten schon. Jedoch will ich diese Routine nun auf alle meine Elemente anwenden, ohne dafür jetzt extra gefühlte 5000 Mouselistener neu zu definieren.

Da spielen nämlich dann die von dir genannten Performancegründe mit hinein. Ich schau mir mal deinen Link an, vielleicht hilft mir das weiter.
 
Aha. Na dann würde das genannte Beispiel ja funktionieren. Aber wenn Du das nicht willst, hier noch ein Vorschlag. Vergiss die GUI als Punkt des Anstosses. Kannst Du nicht einfach eine Klasse basteln, über die alle Funktionen (die man fernsteuern kann) laufen müssen. Das ist dann ähnlich wie das obrige Beispiel, aber noch näher am Geschehen. Beispiel:
Java:
public class RemoteManager{
        private boolean isBusy = false;
        
        public void switchChannel(int channel){
            isBusy = true;
            //Der eigentliche Remoteaufruf
            isBusy = false;
        }
        
        public boolean isBusy(){
            return isBusy;
        }
    }

Das ist wzar nicht Threadsafe und noch kein Singleton, aber ich glaube es kann das Prinzip verdeutlichen, oder?
 
Zurück