Problem mit einer JComboBox, Event temporär deaktivieren

FrittenFritze

Mitglied
Hallo zusammen,

ich habe da ein kleines Problem und zwar habe ich folgende Konstellation:

1. eine JComboBox wird "von aussen" befüllt, diese hat einen ActionListener registriert.
2. dieser ActionListener feuert, wenn ein Eintrag ausgewählt wird und befüllt die zweite JComboBox
3. die wiederrum auch einen ActionListener registriert hat
4. der dann feuert wenn in der zweiten JComboBox ein Eintrag ausgewählt wird.

Das ganze funktioniert auch einwandfrei, beim ersten Mal. Wenn man die erste JComboBox dann verändert, fliegt das Ganze mit einer NPE raus. Es ist so, dass die erste JComboBox die Einträge aus der zweiten rauswirft und beim ChangeEvent der ActionListener der zweiten JComboBox feurt.

Gibt es eine Möglichkeit zu sagen "jetzt deaktiviere ich kurzzeitig die Events" und sie dann wieder einschalten?

Hier der Code:

Code:
    JComboBox<Object> cbxLang = new JComboBox<Object>();
     Iterator<String> iterator = languageList.iterator();
     
     JComboBox<Object> cbxModel = new JComboBox<Object>();
     
     while (iterator.hasNext()) {
       String next = iterator.next();
       cbxLang.addItem(makeObj(next));
     }
     
     cbxLang.addActionListener(new ActionListener() {
       
       @Override
       public void actionPerformed(ActionEvent e) {
         _wds_dvd.setDVDLanguage(((JComboBox<Object>)e.getSource()).getSelectedItem().toString());
         _logger.info("Selected language: " +((JComboBox<Object>)e.getSource()).getSelectedItem().toString());
         
         List<String> modelList = _wds_dvd.getModelList();
         Iterator<String> iterator = modelList.iterator();
         
         cbxModel.removeAllItems();
         
         
         while (iterator.hasNext()) {
           String next = iterator.next();
           cbxModel.addItem(makeObj(next));
         }
         
         cbxModel.addActionListener(new ActionListener() {
           
           @Override
           public void actionPerformed(ActionEvent e) {
             _logger.info("Selected modelline: " + ((JComboBox<Object>)e.getSource()).getSelectedItem().toString());
             _wds_dvd.setModel(((JComboBox<Object>)e.getSource()).getSelectedItem().toString());
             try {
               String navigationXML = _wds_dvd.getNavigationXML();
               _navTree.setIconLocation(_wds_dvd.getIconLocation());
               _navTree.setCellRenderer(new WDSCellRenderer());
               _navTree.buildNavigationTree(navigationXML);
               open_wds ();
             } catch (IOException e1) {
               e1.printStackTrace();
             }
           }
         });
       }
     });

Danke Euch schon mal. :)
 

Thallius

Top Contributor
Du könntest auch einfach mal ein paar sicherheitsabfragen in deinen actionlistener machen. Wenn du natürlich einfach auf getsource.getselecteditem zugreifst obwohl vielleicht gar keine items drin sind, dann kann das nicht klappen
 

FrittenFritze

Mitglied
Naja, das beseitigt ja nicht das eigentliche Problem, dass der ActionListener feuert, obwohl es gar nicht notwendig ist. Das Sauberste wäre den ActionListener rauszuhängen...
 

FrittenFritze

Mitglied
Lösung gefunden:

Code:
     JComboBox<Object> cbxLang = new JComboBox<Object>();
     Iterator<String> iterator = languageList.iterator();
     
     JComboBox<Object> cbxModel = new JComboBox<Object>();
     
     while (iterator.hasNext()) {
       String next = iterator.next();
       cbxLang.addItem(makeObj(next));
     }
     
     cbxLang.addActionListener(new ActionListener() {
       
       @Override
       public void actionPerformed(ActionEvent e) {
         _wds_dvd.setDVDLanguage(((JComboBox<Object>)e.getSource()).getSelectedItem().toString());
         _logger.info("Selected language: " +((JComboBox<Object>)e.getSource()).getSelectedItem().toString());
         
         List<String> modelList = _wds_dvd.getModelList();
         Iterator<String> iterator = modelList.iterator();
         
         final ActionListener[] actionListeners = cbxModel.getActionListeners();
         
         for (final ActionListener listener : actionListeners) {
           cbxModel.removeActionListener(listener);
         }
         
         try {
           cbxModel.removeAllItems();
           while (iterator.hasNext()) {
             String next = iterator.next();
             cbxModel.addItem(makeObj(next));
           }
         } finally {
           for (final ActionListener listener : actionListeners) {
             cbxModel.addActionListener(listener);
           }
         }
         
         cbxModel.addActionListener(new ActionListener() {
           
           @Override
           public void actionPerformed(ActionEvent e) {
             _logger.info("Selected modelline: " + ((JComboBox<Object>)e.getSource()).getSelectedItem().toString());
             _wds_dvd.setModel(((JComboBox<Object>)e.getSource()).getSelectedItem().toString());
             try {
               String navigationXML = _wds_dvd.getNavigationXML();
               _navTree.setIconLocation(_wds_dvd.getIconLocation());
               _navTree.setCellRenderer(new WDSCellRenderer());
               _navTree.buildNavigationTree(navigationXML);
               open_wds ();
             } catch (IOException e1) {
               e1.printStackTrace();
             }
           }
         });
       }
     });

Mit getActionListeners holt man sich alle registrierten Listener raus, läuft die Liste durch und löscht sie (.remove(listener)), macht was auch immer man machen will und hängt sie wieder rein (.addActionListener(listener)).

Fertig...
 

Joose

Top Contributor
Falsch ist es nicht, aber unnötig die Listener zu entfernen um sie dann wieder hinzuzufügen.
Eine einfache Abfrage in der actionPerformed wie Thallius schon gesagt hat würde reichen.
 

Thallius

Top Contributor
Was meinst du wohl was mehr Performance kostet? Eine If-Abfrage oder das Hinzufügen und Entfernen der Listener?

Das ist einfach typisch für die heutige Zeit. Speicher und CPU Power haben wir ja genug und wenn nicht soll sich der User gefälligst einen besseren Rechner kaufen.

In diesem Fall ist es sogar weniger Code die Performance zu steigern als Deine merkwürdige Lösung. Aber hey es funktioniert ja warum sollte ich also weiter drüber nachdenken....
 

FrittenFritze

Mitglied
Hast Du schlecht gegessen??? Typisch für heutige Zeit, so ein Schwachsinn.

Diese Abfrage läuft genau ein mal beim Start... jetzt bleib mal auf dem Teppich. Und der einzige User bin ich selbst....
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Ich würde das nicht gerade als "merkwürdige" Lösung bezeichnen. Bei uns handhaben wir das genau so. Warum? Weil mit organischem wachsen der Software handelt man sich so immer mehr und mehr solcher if/elses ein. Diese haben dann mit der eigentlichen Aufgabe der Listener nichts mehr zu tun und dienen nur noch der Steuerung: "Darf ich nun oder darf ich nicht". Der Code wird dadurch mitunter schwerer lesbar. Darum wurde bei uns diese Guideline des Entfernens/wieder hinzufügens eingeführt.

Meiner Meinung nach kann man heutzutage gut und gerne auf Performance Optimierung verzichten, wenn dadurch besser wartbarer/lesbarer Code entsteht. Das kann natürlich jeder so machen wie er will. Letztenendes ist es wohl eine Design Entscheidung.
 

FrittenFritze

Mitglied
Darum wurde bei uns diese Guideline des Entfernens/wieder hinzufügens eingeführt.

Genau diese Guideline gab es bei uns auch. Gab weil ich nicht mehr bei dem Arbeitgeber bin. Ich bin nicht dafür etwas unnötig feuern zu lassen um dann abzufragen "brauche ich oder nicht". Das ist ein schlechtes Design, so meine Meinung, auch wenn "Herr Softwareentwickler" es anders sehen mag. Vor allem, wenn Tausende von diesen Event fliegen... was da wohl mehr Performance kostet????

Egal, Problem gelöst, Diskussion zu Ende.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Problem beim Einlesen einer Textdatei Allgemeine Java-Themen 12
C Klassen Problem mit Funktion einer Generischen Klasse die ein Interface implementiert Allgemeine Java-Themen 0
W Problem mit Index in einer for-Schleife Allgemeine Java-Themen 8
O Problem beim Auslesen einer Arraylist von JComboBoxen Allgemeine Java-Themen 2
J problem mit einer var Allgemeine Java-Themen 2
J Problem beim Auslesen einer Datei vom Server Allgemeine Java-Themen 4
M Problem beim schreiben einer eigene generische Klasse Hashtable Allgemeine Java-Themen 11
M Problem beim schreiben einer eigene generische Klasse LinkedList Allgemeine Java-Themen 34
D Problem bei der Darstellung einer trigonometrischen Funktion Allgemeine Java-Themen 2
N Problem beim lesen einer File in JAR-File Allgemeine Java-Themen 3
H Problem beim Sortieren einer HashMap mit TreeSet Allgemeine Java-Themen 4
M Problem bei einer Baumausgabe auf der Konsole Allgemeine Java-Themen 3
F Bluetooth / Synchronisation : Problem mit einer Bluetoothanwendung Allgemeine Java-Themen 3
M Problem mit Zeichen aus einer Datei auslesen Allgemeine Java-Themen 2
Apo JNI-Problem beim erneuten Laden einer dll Allgemeine Java-Themen 28
A Problem beim serialisieren/deserialisieren einer ArrayList Allgemeine Java-Themen 3
A Problem mit Öffnen einer Datei Allgemeine Java-Themen 3
S Problem mit einer Klasse Allgemeine Java-Themen 10
A Problem mit dem Auslesen aus einer Datei Allgemeine Java-Themen 4
D Problem bei Aufruf einer Funktion Allgemeine Java-Themen 3
G Problem mit einer Variable Allgemeine Java-Themen 3
E Problem beim Anlegen einer Datei Allgemeine Java-Themen 4
D Problem bei einer Berechnung (pow?) Allgemeine Java-Themen 3
O Problem mit einer Methode Allgemeine Java-Themen 2
C Problem mit Class.getResource() in einer Jar-Datei Allgemeine Java-Themen 4
B problem beim erstellen einer ausführbaren jar-datei Allgemeine Java-Themen 5
krgewb Problem mit Umlauten und Eszett bei InputStream Allgemeine Java-Themen 3
Max246Sch Backtracking Problem Box Filler Allgemeine Java-Themen 6
NightVision402 VisualVM Startskript Problem Allgemeine Java-Themen 3
javaBoon86 Email Server Connection Problem Allgemeine Java-Themen 1
F Problem mit PDFBOX Library Allgemeine Java-Themen 1
A Java modul Problem Allgemeine Java-Themen 4
D Read JSON File Problem Allgemeine Java-Themen 9
urmelausdemeis Exception in thread "main" java.lang.Error: Unresolved compilation problem: Allgemeine Java-Themen 7
J Problem mit JasperReports Allgemeine Java-Themen 8
M log4j Problem mit jlink Allgemeine Java-Themen 19
8u3631984 Problem beim Mocken von Record Klassen Allgemeine Java-Themen 4
torresbig Website login Problem - Jsoup, wie bisher, klappt nicht! Allgemeine Java-Themen 31
P Selenium . getText Problem Allgemeine Java-Themen 9
A Jar zu Exe Problem Allgemeine Java-Themen 13
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
S Folgendes Problem bei einem Programm Allgemeine Java-Themen 1
stormyark Problem beim Klassen erstellen Allgemeine Java-Themen 1
A Thread.sleep Problem Allgemeine Java-Themen 2
A Problem bei der Nachbarschafttest Allgemeine Java-Themen 11
Splayfer Problem: no main manifest attribute Allgemeine Java-Themen 3
G javamail Problem beim Empfangen von Nachrichten Allgemeine Java-Themen 3
Splayfer JDA Problem mit MessageCounter Allgemeine Java-Themen 0
Splayfer Problem mit BufferedWriter Allgemeine Java-Themen 3
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
N Maven Problem mit Datenbanktreiber (H2 Embedded) Allgemeine Java-Themen 12
T Problem beim Umwandeln in eine Jar-Datei Allgemeine Java-Themen 3
B Einfach Elemente zweier Arraylisten kreuz und quer vergleichen, min und max Problem? Allgemeine Java-Themen 16
C ArrayList Problem Allgemeine Java-Themen 3
kev34 nim-Spiel problem Allgemeine Java-Themen 1
D Firebase retrieve data Problem, Child Element wird nicht angesprochen Allgemeine Java-Themen 0
G Welches Problem besteht bei den Typparametern? Allgemeine Java-Themen 5
temi Problem mit Aufrufreihenfolge bei Vererbung Allgemeine Java-Themen 3
Sumo_ow "ArrayIndexOutofBoundsException: 2" Array Problem Allgemeine Java-Themen 6
T PIM basierend auf netbeans via AnyDesk Problem Allgemeine Java-Themen 3
xGh0st2014 Problem mit Java Array Allgemeine Java-Themen 1
Kirby.exe Verständnis Problem bei Rucksack Problem Allgemeine Java-Themen 6
B Eclipse-Lombok-Problem Allgemeine Java-Themen 19
I Input/Output ObjectOutputStream - Problem Allgemeine Java-Themen 7
1 Multiple Choice Knapsack- Problem Allgemeine Java-Themen 2
kodela Problem mit strukturiertem Array Allgemeine Java-Themen 18
E Problem mit Gridlayout und Button Allgemeine Java-Themen 2
A Array Problem Allgemeine Java-Themen 8
bueseb84 Problem Allgemeine Java-Themen 0
S Problem mit Arrays Allgemeine Java-Themen 1
D Nullpointer Exception Problem Allgemeine Java-Themen 5
B Problem mit meinen Klassen Allgemeine Java-Themen 6
A HashMap Methode "get()"-Problem Allgemeine Java-Themen 28
J Problem beim Umstellen auf Java jdk 13 Allgemeine Java-Themen 3
J Problem bei Install java 13 Allgemeine Java-Themen 3
X Profitable Reise Problem Allgemeine Java-Themen 32
A Problem beim öffnen von Java-Installern Allgemeine Java-Themen 1
Dann07 Problem mit JavaMail API Allgemeine Java-Themen 26
J Problem beim Generischen Klassen und Interfaces Allgemeine Java-Themen 2
L Klassen Algorithmus für das folgende Problem entwickeln? Allgemeine Java-Themen 30
J Clear-Problem Allgemeine Java-Themen 10
B Problem zu einem Java Projekt Allgemeine Java-Themen 6
S JFileChooser Problem Allgemeine Java-Themen 4
M Traveling Salesman - MST Heuristik Problem Allgemeine Java-Themen 4
J Traveling Salesman Problem Allgemeine Java-Themen 14
E Java Editor Problem mit 2er Exceptions Allgemeine Java-Themen 12
C code oder Bibliotheken für 2-Center Problem Allgemeine Java-Themen 4
M Salesman Problem - Bruteforce Algorithmus Allgemeine Java-Themen 23
S Methoden Problem mit NullPointerException Allgemeine Java-Themen 9
Javafan02 Problem mit if-clause Allgemeine Java-Themen 17
J Lombok Problem mit Konstruktoren bei Verberbung Allgemeine Java-Themen 1
kodela Event Handling Problem mit der Alt-Taste Allgemeine Java-Themen 16
W Threads Problem Allgemeine Java-Themen 15
D (Verständnis-)Problem mit Unterklasse Allgemeine Java-Themen 4
S Problem mit Generic bei unmodifiableCollection Allgemeine Java-Themen 4
S jserialcomm Problem Allgemeine Java-Themen 1
Flynn Thread-Problem... Allgemeine Java-Themen 2
J Generische Interface - Problem Allgemeine Java-Themen 3
G Problem beim GUI Allgemeine Java-Themen 9
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7

Ähnliche Java Themen

Neue Themen


Oben