Wie mehrere JComboBoxen in Abhängigkeit einer anderen Box ändern?

it-girl

Aktives Mitglied
Hallo zusammen,

ich möchte in meinem Programm eine GUI mit 3 (evtl auch später mehr) JComboBoxen haben, die sich je nach Auswahl der vorherigen Box anpassen.
Also zB. wenn die erste Box "Bäume, Blumen, Gräser, Sträucher" enthält und ich dann "Blumen" auswähle, soll die zweite Box "Tulpen, Rosen, Nelken" enthalten. Wenn ich davon wieder eine auswähle, soll die 3. Box entsprechend wieder etwas anderes enthalten. Alle außer der ersten Box sollen leer sein, wenn in der 1. nichts ausgewählt ist.

Wie kann ich das implementieren? Also die erste Box habe ich schon "füllen" können. Nun möchte ich aber, wenn ich etwas darin anklicke, den Inhalt der 2. Box generieren. Meine Frage ist nun, muss ich dafür für jedes Item der Box eine eigene if-Abfrage machen oder geht das irgendwie einfacher?

Danke schon mal für eure Antworten.

LG it-girl
 
Zuletzt bearbeitet:
JComboBox besitzt bereits die Methode contentsChanged(). Ist aber für Dein Vorhaben irrelevant.

Du musst einfach nur per (Action)Listener auf eine Änderung der ComboBox reagieren und der "nachfolgenden" ComboBox per setModel(...) das zur Selektion passende Datenmodell setzen.
 
Eigentlich brauchst du keine if Abfragen:
Beispiel:
Java:
package test;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Main {

	public static void main(String[] args) {
		final JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		A baum = new A("Bäume");
		A tanne = new A("Tanne");
		A eiche = new A("Eiche");
		
		tanne.getAs().add(new A("Irgendwas"));
		tanne.getAs().add(new A("Sinnvolles"));
		
		eiche.getAs().add(new A("Nichts"));
		eiche.getAs().add(new A("Viel"));
		
		baum.getAs().add(tanne);
		baum.getAs().add(eiche);
		
		A blume = new A("Blumen");
		A tulpe = new A("Tulpen");
		A rose = new A("Rosen");
		
		tulpe.getAs().add(new A("Hallo"));
		tulpe.getAs().add(new A("Willkommen"));
		
		rose.getAs().add(new A("???"));
		rose.getAs().add(new A("!!!"));
		
		blume.getAs().add(tulpe);
		blume.getAs().add(rose);
		
		
		final JComboBox jComboBox = new JComboBox(new Object[]{blume,baum});
		final JComboBox jComboBox1 = new JComboBox();
		final JComboBox jComboBox2 = new JComboBox();
		
		jComboBox.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				jComboBox1.setModel(new DefaultComboBoxModel(((A)jComboBox.getSelectedItem()).getAs().toArray()));
				
			}
		});
		
		jComboBox1.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				jComboBox2.setModel(new DefaultComboBoxModel(((A)jComboBox1.getSelectedItem()).getAs().toArray()));
				
			}
		});
		
		
		frame.add(jComboBox, BorderLayout.NORTH);
		frame.add(jComboBox1, BorderLayout.CENTER);
		frame.add(jComboBox2, BorderLayout.SOUTH);
		
		SwingUtilities.invokeLater(new Runnable() {
			
			@Override
			public void run() {
				frame.pack();
				frame.setVisible(true);
				
			}
		});

	}
}

Java:
package test;

import java.util.ArrayList;
import java.util.List;

public class A {

	private String name;
	
	private List<A> as = new ArrayList<A>();

	public A(String name) {
		this.name = name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void setAs(List<A> as) {
		this.as = as;
	}

	public List<A> getAs() {
		return as;
	}
	
	@Override
	public String toString() {
		return name;
	}
}
 
Danke, ihr habt mir schon mal sehr geholfen 🙂

Nun möchte ich aber noch die doppelten Einträge in meiner ArrayList<String> entfernen, mit der ich die Combobox fülle, sodass jedes Item nur noch ein Mal drin vorkommt.
Habe dazu schon einen Thread gefunden, wo das mit einem HashSet implementiert ist. Aber das hat mir nicht wirklich weitergeholfen, denn die Werte lassen sich dann nicht als String auslesen. Also mit toString() kommt dann schon ein String bei raus, aber der sieht dann aus wie "java.util.HashMap$KeyIterator@a470b8" und ich hätte doch gerne richtige Wörter in meiner Combobox stehen 😉 Wie mach ich das denn?

Hatte das mal so probiert (StingTokenizer, weil die Einträge vorher so aussahen: Baum|Blume, Blume|Gräser|Baum, ... etc):
Java:
for (int a = 0; a < Main.combo1Items.length; a++) {
	StringTokenizer st = new StringTokenizer(Main.combo1Items[a], "|");
	while (st.hasMoreTokens()) {
		if (list.contains(st.nextToken())) {
			combo.addItem(st.nextToken());
		}
	}
}
Aber dann bekomm ich beim zweiten Aufruf von st.nextToken() eine NullPointer, weil dieses Token noch nicht von der Schleife abgecheckt wurde, denn das erste und das zweite st.nextToken() beziehen sich nicht auf das selbe Token.

LG it-girl
 
Zuletzt bearbeitet:
mit nextToken() holst Du ja bereits das nächste Token und der "Zeiger" springt eins weiter, deshalb versucht die VM am Ende auf ein weiteres Token zu zugreifen, obwohl es keines mehr gibt.
Java:
    while (st.hasMoreTokens()) {
        String token = st.nextToken();
        if (list.contains(token)) {
            combo.addItem(token);
        }
    }
Grundsätzlich würde ich in dem Fall mit ComboBoxModels arbeiten und nicht die Einträge direkt in die ComboBox stecken.
 
@SirWayne: Muss nun doch nochmal was fragen. Was bedeutet/soll/macht denn das
Code:
... .getAs().toArray()
in
Java:
jComboBox2.setModel(new DefaultComboBoxModel(((A)jComboBox1.getSelectedItem()).getAs().toArray()));
?
Bzw. kann ich das auch mit der ArrayList<String> anstatt <A> machen? Und wenn ja, wie geht das dann?

Das alles...
Java:
A baum = new A("Bäume");
        A tanne = new A("Tanne");
        A eiche = new A("Eiche");
        
        tanne.getAs().add(new A("Irgendwas"));
        tanne.getAs().add(new A("Sinnvolles"));
        
        eiche.getAs().add(new A("Nichts"));
        eiche.getAs().add(new A("Viel"));
        
        baum.getAs().add(tanne);
        baum.getAs().add(eiche);
        
        A blume = new A("Blumen");
        A tulpe = new A("Tulpen");
        A rose = new A("Rosen");
        
        tulpe.getAs().add(new A("Hallo"));
        tulpe.getAs().add(new A("Willkommen"));
        
        rose.getAs().add(new A("???"));
        rose.getAs().add(new A("!!!"));
        
        blume.getAs().add(tulpe);
        blume.getAs().add(rose);
... lege ich auch nicht "von Hand" an, sondern ziehe ich aus einer Datenbank.
 
Zuletzt bearbeitet:

Zurück
Oben