Items von JComboBoxen "verbinden"

dastool

Erfahrenes Mitglied
Guten Abend,
ich hab mal wieder ein geistiges Tief :(

Ich möchte mehrere JComboBoxen in gewisser weisse "verbinden".

Box1 hat Items, wenn eines davon Ausgewählt wurde, soll aus einer bestimmten Datei die Items für die 2te Box geladen und angezeigt werden. So auch bei der dritten, wenn bei der 2ten eine Auswahl getroffen wurde.

Der Dateiname sollte möglichst über einen String angegeben werden.
Ich hab die Klasse dafür schon vorhanden um Dateien zu lesen und gegebenenfalls anzulegen, wenn sie nicht vorhanden ist.

(zur übersicht im Code unten
Box1 = comboArtikel
Box2 = combAB
Box3 = combHer
)





Hier ein teil vom Code (ist mit NetBeans IDE 5 RC 2 gemacht daher generated Code und nur ein teil davon)
Der Code-Schnipsel bei Zeile 3 ist der Punkt an dem ich häng. Der so auch nicht funktioniert.

Die Frage ist nun: Wie komm ich an den String?

Java:
    private void loadAB(java.awt.event.ItemEvent evt) {
// TODO add your handling code here:
        comboAB.addItem(obj(comboArtikel.getSelectedItem()));
    }
    
    private void onStartUp(java.awt.event.WindowEvent evt) {
// TODO add your handling code here:
        comboArtikel.addItem(obj("artikel"));
        //comboAB.addItem(obj("artikelbezeichnung"));
        //comboHer.addItem(obj("hersteller"));
        comboMenge.addItem(obj("menge"));
        comboHaendler.addItem(obj("haendler"));
        comboOrt.addItem(obj("ort"));
    }
    
       
    private Object obj(final String item) {
        return new Object() {
            public String toString() {
                String line = "";
                try {
                    ArrayList lines = zugriff.arrayLesen(item);
                    Iterator it = lines.iterator();
                    while(it.hasNext()) {
                        line = (String) it.next();
                        return line;
                    }
                } catch(FileNotFoundException fnfe) {
                  
                    
                } catch (IOException ioe) {
                    
                }
                return line;
            }
        };
    }
 
Hallo Martin,

schau mal hier:

Code:
import java.awt.GridLayout;

import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;

public class GridBagExample extends JFrame implements PopupMenuListener {

	String[] zahlen = { "1", "2", "3" };

	String[] buchstaben = { "a", "b", "c" };

	JComboBox combo1 = new JComboBox(new String[] { "Zahlen", "Buchstaben" });

	JComboBox combo2 = new JComboBox(zahlen);

	public GridBagExample() {
		setLayout(new GridLayout(2, 1));
		add(combo1);
		add(combo2);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationByPlatform(true);
		setSize(200, 100);
		setVisible(true);

		combo1.addPopupMenuListener(this);
	}

	public static void main(String[] args) {
		GridBagExample test = new GridBagExample();
	}

	public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
	}

	public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
		if (combo2.getItemCount() != 0)
			combo2.removeAllItems();
		if (combo1.getSelectedItem().equals("Zahlen"))
			for (int i = 0; i < zahlen.length; i++)
				combo2.addItem(zahlen[i]);
		else
			for (int i = 0; i < buchstaben.length; i++)
				combo2.addItem(buchstaben[i]);
	}

	public void popupMenuCanceled(PopupMenuEvent e) {
	}
}


Vg Erdal
 
Ich glaub ich hab das nun anderweitig gelöst.
Da die Items ja als Objekte eingesetzt sind, sollte ich doch wohl einfach toString() benutzen, oder? :)

Werds nun einfach mal testen, wenn es nicht klappen sollte, werde ich deinen Rat nochmals durchgehen :)

//Edit

So, @Flasray
Ich hab da ein kleines Problem mit deinem Codebeispiel...
Ich blick da im moment überhaupt ned druch :(


Durch ein wenig rumsuchen hier im Forum, vorallem in dieser Swing/AWT/SWT - Abteilung hab ich einiges sehr brauchbares gefunden. Danke erstmal an die anderen Helfer :)

Das bisherige Problem mit dem "Verbinden" besteht leider immernoch.
Ich hab nun die Sache erstmals von Dateien abgewendet und in 3 Kategorien untergeteilt.
Die erste besteht nun aus 7 JRadioButtons, welche via Listener der ersten JComboBox sagen, wann sie welche änderung vornehmen soll.

Durch 3 Methoden hab ich das nun auch prima hinbekommen.

Methode 1
Java:
private void rbEvent(ActionEvent evt) {
        
        
        int iSelectedRadioButton = getSelectedRadioButton();
        switch ( iSelectedRadioButton ) {
            case rb0:
                cUKat1.removeAllItems();
                cUKat1.addItem(obj("Kleidung"));
                cUKat1.addItem(obj("Schuhe"));
                cUKat1.addItem(obj("Bettausstattung"));
                cUKat1.addItem(obj("Ernährung"));
                cUKat1.addItem(obj("Pflege"));
                cUKat1.addItem(obj("Sonstiges"));
                break;
            case rb1:
                cUKat1.removeAllItems();
                cUKat1.addItem(obj("Schwein"));
                cUKat1.addItem(obj("Rind"));
                cUKat1.addItem(obj("Huhn"));
                cUKat1.addItem(obj("Pute"));
                cUKat1.addItem(obj("Fisch"));
                cUKat1.addItem(obj("Sonstiges"));
                break;
            case rb2:
                cUKat1.removeAllItems();
                cUKat1.addItem(obj("Salat"));
                cUKat1.addItem(obj("Tomate"));
                cUKat1.addItem(obj("Zwiebeln"));
                cUKat1.addItem(obj("Knoblauch"));
                cUKat1.addItem(obj("Lauch"));
                cUKat1.addItem(obj("Sonstiges"));
                break;
            case rb3:
                cUKat1.removeAllItems();
                cUKat1.addItem(obj("Haarpflege"));
                cUKat1.addItem(obj("Körperpflege"));
                cUKat1.addItem(obj("Mundpflege"));
                cUKat1.addItem(obj("Geschirrspülmittel"));
                cUKat1.addItem(obj("Waschmittel"));
                cUKat1.addItem(obj("Glasreinigung"));
                cUKat1.addItem(obj("Bodenreinigung"));
                cUKat1.addItem(obj("Sonstiges"));
                break;
            case rb4:
                cUKat1.removeAllItems();
                cUKat1.addItem(obj("Apfel"));
                cUKat1.addItem(obj("Banane"));
                cUKat1.addItem(obj("Orangen"));
                cUKat1.addItem(obj("Mandarine"));
                cUKat1.addItem(obj("Birne"));
                cUKat1.addItem(obj("Sonstiges"));
                break;
            case rb5:
                cUKat1.removeAllItems();
                cUKat1.addItem(obj("Müsli"));
                cUKat1.addItem(obj("Marmelade"));
                cUKat1.addItem(obj("Milch"));
                cUKat1.addItem(obj("Sonstiges"));
                break;
                
            case rb6:
                cUKat1.removeAllItems();
                cUKat1.addItem(obj("Hundenahrung"));
                cUKat1.addItem(obj("Katzennahrung"));
                cUKat1.addItem(obj("Nagernahrung"));
                cUKat1.addItem(obj("Sonstiges"));
                break;
        }
        
        
    }

Methode 2
Java:
private int getSelectedRadioButton() {
        
        if ( rbFleisch.isSelected() ) {
            return rb1;
        }
        if ( rbGemuese.isSelected() ) {
            return rb2;
        }
        if ( rbHyg.isSelected() ){
            return rb3;
        }
        if ( rbObst.isSelected() ){
            return rb4;
        }
        if(rbSonsN.isSelected()){
            return rb5;
        }
        if(rbTierwelt.isSelected()){
            return rb6;
        } 
        
        return rb0;
    }

Methode 3
Java:
    private Object obj(final String item)  {
        return new Object() { public String toString() { return item; } };
    }

Nun steh ich vor dem Problem, der zweiten JComboBox zu sagen, dass sie sich bei jeder änderung von RadioButtons UND der ersten Combobox ändern soll.
Also, wenn im case rb1 das Item mit dem String "Schwein" angeklickt wird, soll in der zweiten ComboBox eben vorgefertigte einträge gemacht werden, z.B. Lende, Braten, Schulter etc.
Nur genau das bekomm ich nicht hin.

Solltet Ihr den ganzen Code brauchen, werd ich ihn eher via PM schicken, da er bis jetzt knapp 600 zeilen hat :)

Gruss

Martin
 
Zuletzt bearbeitet:
Hallo Martin,

hier ein Minibeispiel das ohne großen Aufwand beliebig erweiterbar ist. Und vorher noch ein Tip. Schreibe die Comboelemente alle in Arrays. Und füge sie nicht einzeln sondern mit einer (for-)Schleife ein. Das spart viel redundanten Code.


Code:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.event.*;

public class ComboBindingExample extends JFrame implements PopupMenuListener,
		ActionListener {

	String[] a = { "a1", "a2", "a3" };

	String[] b = { "b1", "b2", "b3" };

	String[] a1 = { "a11", "a12", "a13" };

	String[] a2 = { "a21", "a22", "a23" };

	String[] a3 = { "a31", "a32", "a33" };

	String[] b1 = { "b11", "b12", "b13" };

	String[] b2 = { "b21", "b22", "b23" };

	String[] b3 = { "b31", "b32", "b33" };

	JRadioButton rb1 = new JRadioButton("a");

	JRadioButton rb2 = new JRadioButton("b");

	JComboBox combo1 = new JComboBox(a);

	JComboBox combo2 = new JComboBox(a1);

	ButtonGroup bg = new ButtonGroup();

	public ComboBindingExample() {

		bg.add(rb1);
		bg.add(rb2);
		rb1.setSelected(true);

		rb1.setName("rb1");
		rb2.setName("rb2");

		setLayout(new GridLayout(2, 2));
		add(rb1);
		add(rb2);
		add(combo1);
		add(combo2);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setLocationByPlatform(true);
		setAlwaysOnTop(true);
		setSize(200, 100);
		setVisible(true);

		combo1.addPopupMenuListener(this);
		rb1.addActionListener(this);
		rb2.addActionListener(this);
	}

	public static void main(String[] args) {
		ComboBindingExample test = new ComboBindingExample();
	}

	public void actionPerformed(ActionEvent e) {
		switch (((JRadioButton) e.getSource()).getName().charAt(2)) {
		case '1':
			fillCombo(combo1, a);
			fillCombo(combo2, a1);
			break;
		case '2':
			fillCombo(combo1, b);
			fillCombo(combo2, b1);
		}
	}

	public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
	}

	public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
		switch (getButton(bg).getName().charAt(2)) {
		case '1':
			fillA();
			break;
		case '2':
			fillB();
		}
	}

	public void popupMenuCanceled(PopupMenuEvent e) {
	}

	public void fillA() {
		switch (combo1.getSelectedIndex()) {
		case 0:
			fillCombo(combo2, a1);
			break;
		case 1:
			fillCombo(combo2, a2);
			break;
		case 2:
			fillCombo(combo2, a3);
		}
	}

	public void fillB() {
		switch (combo1.getSelectedIndex()) {
		case 0:
			fillCombo(combo2, b1);
			break;
		case 1:
			fillCombo(combo2, b2);
			break;
		case 2:
			fillCombo(combo2, b3);
		}
	}

	public void fillCombo(JComboBox combo, String[] content) {
		combo.removeAllItems();
		for (int i = 0; i < content.length; i++)
			combo.addItem(content[i]);
	}

	public AbstractButton getButton(ButtonGroup bg) {
		AbstractButton ab = null;
		Enumeration<AbstractButton> en = bg.getElements();
		while (en.hasMoreElements()) {
			ab = en.nextElement();
			if (ab.isSelected())
				break;
		}
		return ab;
	}
}


Vg Erdal
 
Super, danke :)
Bin nun ne weile wohl am rödeln, bis ich das allles passend hab :)
Ich frag mich grad nur eines:
Was passiert, wenn ich bei einer auswahl nur 5 möglichkeiten hab, und bei einer weiteren 7 oder mehr?
 
Gute Mitternacht Martin,

unterschiedliche Größen sind für meinen Code gar kein Problem. Nach so viel Mühe nimmst du mir hoffentlich das bisschen Eigenlob nicht übel ^^ .

Du musst einfach nur Schrittweise an der Richtigen Ecke erweitern.

Ich hoffe du verstehst den Aufbau des Codes, war jetzt zu faul um da noch irgendwelche Kommentare reinzuschreiben.

Vg Erdal
 
Bisher läuft alles Astrein *lob*
Ist nurnoch ne Frage der "Eingabe" ...
Sobald ich das in DB umsetzen kann, wird da wohl einiges an Code wegfallen :)


//edit

UIuiui... nu hab ichs geschafft :)

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at easybuy.EasyJFrame.actionPerformed(EasyJFrame.java:338)

338: switch (((JRadioButton) e.getSource()).getName().charAt(2)) {

Was Netbeans wohl damit meint?:confused:
 
Zuletzt bearbeitet:
Guten Morgen Martin,

ich glaube du hast vergessen den Radiobuttons namen zu vergeben.

rb1.setName("rb1");
rb2.setName("rb2");
rb3.setName("rb3");
...

Zweifelsfalls häng den ganzen Code an, oder schick ihn mir mal.

Vg Erdal
 
Zurück