JavaFX 1 Listener für mehrere ChoiceBoxen

Diskutiere 1 Listener für mehrere ChoiceBoxen im AWT, Swing, JavaFX & SWT Bereich.
N

N0Name

Hi,
ich wollte mal wissen, ob man EINEN ChangeListener für mehrere ChoiceBoxen verwenden kann. Der dann also mehrere ChoiceBoxen auf einmal ausliest.

Code:
value1.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

                    value2.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
                        @Override
                        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                          
                            }

                        }
                    });
Das wäre meine Idee, da hab ich aber halt 2 Listener, das ist halt gerade mein Problem.

Hoffe man kann mich verstehen.
 
F

fhoffmann

Du implementierst hier den Listener als anonyme innere Klasse.
Du kannst ihn natürlich auch als gewöhnliche (möglicherweise innere) Klasse definieren.
Dann kannst du ihn auch unterschiedlichen Komponenten zuorden.
 
F

fhoffmann

Um es noch genauer zu sagen:
Java:
class IrgendeineKlasse {
    void irgendeineMethode() {
        irgendwer.addListener(new ChangeListener() {
            @Override
            public void changed(...) {
                // tu was
            }
        });
    }
}
ist dasselbe wie:
Java:
class IrgendeineKlasse {
    void irgendeineMethode() {
        irgendwer.addListener(new IrgendeinChangneListener());
    }
    
    class IrgendeinChangneListener implements ChangeListener {
        @Override
        public void changed(...) {
            // tu was
        }
    }
}
Und dann kannst du natürlich auch schreiben:
Java:
class IrgendeineKlasse {
    void irgendeineMethode() {
        irgendwer.addListener(new IrgendeinChangneListener());
        jemandAnderes.addListener(new IrgendeinChangneListener());
        undNochEiner.addListener(new IrgendeinChangneListener());
    }
    
    class IrgendeinChangneListener implements ChangeListener {
        @Override
        public void changed(...) {
            // tu was
        }
    }
}
(Alles aus dem Kopf getippt und natürlich nicht getestet)
 
J

JustNobody

Wobei die Lösung von @fhoffmann immer noch zwei Instanzen der Klasse erzeugt.

Generell wird ja ein ChangeListener benötigt. Wie Du den erzeugst, ist erst einmal egal. Du kannst immer den ChangeListener in einer Variable speichern und dann mehrfach verwenden:
Java:
ChangeListener<String> listener = new ChangeListener<String>() {
                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

                    value2.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
                        @Override
                        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                         
                            }

                        }
                    }
                                                                                 
value1.getSelectionModel().selectedItemProperty().addListener(listener);
Das ginge dann auch noch weiter hin zu dem Sonderfall: Die äußere Klasse implementiert ChangeListener<String>, d.h. die Methode mit @Override wandert in die eigentliche Klasse und der Parameter ist dann this:


Java:
public class WhateverYourClassIs implements ChangeListener<String>() {

// ...
                @Override
                public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {

                    value2.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
                        @Override
                        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                         
                            }

                        }

// ...                                                                                 
value1.getSelectionModel().selectedItemProperty().addListener(this);
Das ist aber nicht das, was ich anraten würde. Statt dessen ist ein Lambda oder eine Methodenreferenz sinnvoll.

Also die Methode heisst dann irgendwie sinnvoll, handleTextChanges oder was auch immer. Natürlich kein @Override.

Und dann kommt da sowas in der Art (So im Forum geschrieben, kann syntaktisch falsch sein):
Code:
public void handleTextChanges(ObservableValue<? extends String> observable, String oldValue, String newValue) {
    // ...
}

value1.getSelectionModel().selectedItemProperty().addListener((o, ov, nv) -> handleTextChanges(o, ov, nv));
Aber da kann man dann genausogut auch die Methodenreferenz statt Lambda nutzen:
Code:
value1.getSelectionModel().selectedItemProperty().addListener(this::handleTextChanges);
 
Thema: 

1 Listener für mehrere ChoiceBoxen

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben