Kapselung if-Abfrage bei "MVC-verteilten" Listenern

baphomet13

Mitglied
Hi Alle,

hoffe der Titel ist korrekt gewählt.

Ich versuche, ein MVC-basiertes GUI zu erstellen und habe dabei Probleme, die if-Abfrage im ActionListener zu gestalten. Vielleicht kann mir jemand helfen? Das Ganze ist wie folgt aufgebaut:

View:
Java:
// ControlForms.java
...

private JPanel createSearchPanel() throws SQLException {

...

comboBoxCode = new JComboBox(); // Klassenvariable comboBoxCode -> JComboBox
        SwingUtilities.invokeLater(new Runnable() {  
            public void run() {  
            	AutoCompleteSupport<Object> support = AutoCompleteSupport.install(comboBoxCode, GlazedLists.eventListOf(jnlCodeArray));
            }  
        });  // Auto-Complete comboBox aus GlazedLists
...

	public void setComboListener(ComboListener comboListener) {
		comboBoxCode.addActionListener(comboListener);
	}
...

Controller:
Java:
 // Controller.java   
public Controller() throws SQLException{

...

    	addListeners();
    }

    private void addListeners(){
    	getView().setExitListener(new ExitListener());
    	getView().setTreeListener(new TreeListener(getView()));
    	getView().getFormPanel().setButtonListener(new ButtonListener());
    	getView().getFormPanel().setComboListener(new ComboListener());
    }

Java:
// ComboListener.java
public class ComboListener implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		System.out.println(e.toString()); // Gibt keine Variablennamen mit aus...
	}
}

Ich will also letztendlich in der ComboListener.java so etwas abfragen wie
Java:
if (e.getSource() == comboBoxCode) ...
Das geht aber natürlich nicht, wenn ich den Variablennamen gar nicht übergeben bekomme. Andererseits soll ComboListener natürlich auch für andere JComboBoxes zur Verfügung stehen, so dass ich nicht ohne if-Abfrage arbeiten kann.

Hat jemand eine Idee? Ich habe ein Brett vor'm Kopf.

Bzw. vielleicht ist die Frage: (wie) kann ich den Variablennamen mit übergeben ohne dass ich alle Konstruktoren der Klassen anpassen muss, damit die aktuelle Instanz der View-Klasse übergeben werden kann?

Danke!
Grüße,
B13
 
Zuletzt bearbeitet:
Ich würde mir da eher die Frage stellen: Muss der Controller die Variable mit der Referenz auf die ComboBox kennen?
Erfüllen die unterschiedlichen ComboBoxen überhaupt eine ähnliche Funktion? Wenn nein, würde ich für die Combos auch mehrere Listener verwenden.
 
Das ist natürlich so ein Punkt, aber spricht das nicht dem Prinzip der Wiederverwertbarkeit entgegen?

Wie sieht das denn in "guter" Codingpraxis aus (von der ich zugegebenermaßen noch nicht viel weiß, haha), hat man da oft für jedes Element einen eigenen Listener?

Danke erstmal für die Hilfe!
 
Wenn du Wiederverwertung möchtest, kannst du ja eine eigene Listenerklasse schreiben, von der du bei den verschiedenen Comboboxen dann jeweils eine Instanz bildest.
 
Das ist natürlich so ein Punkt, aber spricht das nicht dem Prinzip der Wiederverwertbarkeit entgegen?

Wie sieht das denn in "guter" Codingpraxis aus (von der ich zugegebenermaßen noch nicht viel weiß, haha), hat man da oft für jedes Element einen eigenen Listener?


Listener werden häufig als anonyme Klasse implementiert, das spricht nicht gegen Wiederverwendbarkeit. Sofern innerhalb der Listeners komplexe Verarbeitung nötig ist, kann man diese Logik in eine Klasse auslagern, damit diese nur ein mal geschrieben werden muss. Das verhindert, das derselbe Code an verschiedenen Stellen innerhalb der Applikation repliziert werden muss, was gegen die Wartbarkeit spricht.

Was MVC betrifft, hilft Dir vielleicht noch dieser MVC Link weiter.
 
Das ist natürlich so ein Punkt, aber spricht das nicht dem Prinzip der Wiederverwertbarkeit entgegen?

Wie sieht das denn in "guter" Codingpraxis aus (von der ich zugegebenermaßen noch nicht viel weiß, haha), hat man da oft für jedes Element einen eigenen Listener?

Danke erstmal für die Hilfe!
Würde eher sagen, dass die Notwendigkeit der Kenntnis des Controllers von der Komponente bei einer Wiederverwendung Aufwand/Probleme machen kann.

Abhängig von der Komplexität der Applikation reicht manchmal ein einfacher (Action)Listener als Interface der View zum Controller aus.
Bei komplexeren Anwendungen würde ich ein "ControllerInterface" definieren, welches der View bekannt ist und über das sie die zur Verfügung stehenden "Dienste" des Controllers kennt und nutzen kann. Dann könnte man ActionListener & Co. innerhalb der View implementieren und ausschließlich über das selbst definiert Interface mit dem Controller kommunzieren.
 

Neue Themen


Zurück
Oben