Sich gegenseitig beeinflussende JComboBoxen

Moin moin,

also ich habe das Problem, das ich mehrere JComboBoxen habe, die ihre Daten aus einer Tabelle bekommen.
Nun möchte ich das wenn man bei einer ComboBox etwas auswählt auch die anderen angepasst werden.
BSp:
1.ComboBox Inhalt: Gebäude, Fahrzeuge, Alles
2.ComboBox Inhalt: Auto,Haus,Turm,LKW,Alles

wähle ich bei ComboBox 1 Gebäude soll nur noch Haus und Turm in 2 zu sehen sein. Andersrum soll die auswahl von Turm dafür sorgen das automatisch Gebäude in der 1. ComboBox ausgewählt ist.

Was ich bereits versucht habe ist die Comboboxen zu leeren und dann das neue Array zu erstellen, was aber daran scheitert, dass ich das aktuell selektierte per getSelectedItem() brauche um das neue Array zu erstellen, ich aber eine Nullpointer Exception bekomme sobald ich die alte Belegung per removeAll() lösche.

Moin,

hast Du denn an den Comboboxen jeweils Actionlistener hängen??

http://docs.oracle.com/javase/tutorial/uiswing/components/combobox.html

Gruß
Klaus

Ja genau das hab ich, wenn eine Änderung geschiet wird die aktuelle auswahl an eine MEthode übergeben, welche sich um die Erstellung der neuen Inhalte kümmern soll.

Moin,

das versteht sich ja von selbst!

Poste mal die relevanten Codeteile … so artet das nur in wilde Raterei aus (zumal ich nicht wirklich verstanden habe, wie Du es versuchst umzusetzen) !

Gruß
Klaus

Combobox1.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent arg0) {

                String auswahl=Combobox1
                        .getSelectedItem().toString();
                if(!auswahl.equals("Wähle:"))
                {
                    
                    String[] angepasst = passeTabellean(Stammdaten, auswahl);
                    aendereCombobox2(angepasst);
                    }
             
              }
        });      


public void aendereCombobox(String[] data) {

    Set<String> cbBelegung = new TreeSet<String>();

    for (int i = Combobox2.getItemCount()-1; i >=0; i--) {
        boolean Itembehalten=false;


        for (String string : cbBelegung)
        {
            if(string.equals(Combobox2.getItemAt(i)))
                Itembehalten=true;
            
            
        }
        if(Itembehalten==false)
            Combobox2.remove(i);
        
        
    }
    



So siehts etwa aus die aendereCobobox Methode produziert auch irgendwie noch Fehler…

Moin,

hmm, was mir so ad hoc auffällt:

[QUOTE=Unregistriert]

           Combobox1.addItemListener(new ItemListener() {

            @Override
            public void itemStateChanged(ItemEvent arg0) {

                String auswahl=Combobox1.getSelectedItem().toString();
                if(!auswahl.equals("Wähle:"))
                {
                    // ############################################
                    // was macht diese Funktion und was ist "Stammdaten"
                    // ############################################
                    String[] angepasst = passeTabellean(Stammdaten, auswahl);
                    aendereCombobox2(angepasst);
                    }
             
              }
        });      


public void aendereCombobox(String[] data) 
{
    // ##############################
    // wird irgendwie NICHT gefüllt, oder ?
    // ##############################
    Set<String> cbBelegung = new TreeSet<String>();   
    for (int i = Combobox2.getItemCount()-1; i >=0; i--) 
    {
        boolean Itembehalten=false;

        // ##############################
        // "cbBelegung" sollte also leer sein !!
        // ##############################
        for (String string : cbBelegung)    
        {
            if(string.equals(Combobox2.getItemAt(i)))
                Itembehalten=true;
        }
        if(Itembehalten==false)
        {
            Combobox2.remove(i);
        }
    }
```[/QUOTE]

Gruß
Klaus

Da hab ich zuviel gekürzt^^
cbBelegung wird natürlich per for schleife mit den Daten aus demangepassten array befüllt;
Die Methode passeTabellean() passt die kompletten Stammdaten an, sodass man ein String[] array erhält,dass sich nur noch die zur auswahl passenden Daten enthält.

Moin,

aha … und wir dürfen jetzt raten, was wie im Endeffekt wirklich passiert ??? :frowning:

Dann noch was:

    for (int i = Combobox2.getItemCount()-1; i >=0; i--)
    {
        boolean Itembehalten=false;
 
        for (String string : cbBelegung)    
        {
            if(string.equals(Combobox2.getItemAt(i)))
            {
                Itembehalten=true;
            }
        }
 
        // #########################################################
        // Du läufst hier zuvor durch die for-Schleife und setzt
        // bei jeden Durchlauf ggf. den Wert "Itembehalten" ...
        // Aber hier, NACH der Schleife hast Du dann natürlich
        // immer nur den LETZTEN Wert der Variable an den Hacken !!
        // Versuch' mal, diesen Teil IN die for-Schleife zu setzen !!
        // #########################################################
        if(Itembehalten==false)
        {
            Combobox2.remove(i);
        }
    }

Gruß
Klaus

Beeinflussen die sich wirklich gengenseitig, oder NUR eine die andere (in EINE Richtung?)

Für ersteres, mal ein Beispiel

import java.awt.GridLayout;
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.JPanel;
import javax.swing.SwingUtilities;


public class LinkedComboBoxes extends JPanel
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                createAndShowGUI();
            }
        });
    }
    
    private static void createAndShowGUI()
    {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(new LinkedComboBoxes());
        f.setSize(600,100);
        f.setVisible(true);
    }

    private boolean updating = false;
    private DefaultComboBoxModel<String> comboBoxModelA;
    private DefaultComboBoxModel<String> comboBoxModelB;
    
    public LinkedComboBoxes()
    {
        super(new GridLayout(1,2));
        comboBoxModelA = new DefaultComboBoxModel<String>(new String[]{ "A0", "A1", "A2" });
        comboBoxModelB = new DefaultComboBoxModel<String>(new String[]{ "B0", "B1", "B2" });
        final JComboBox<String> comboBoxA = new JComboBox<String>(comboBoxModelA);
        final JComboBox<String> comboBoxB = new JComboBox<String>(comboBoxModelB);
        
        comboBoxA.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Object selected = comboBoxA.getSelectedItem();
                selectedInA(selected);
            }
        });
        
        comboBoxB.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Object selected = comboBoxB.getSelectedItem();
                selectedInB(selected);
            }
        });
        
        add(comboBoxA);
        add(comboBoxB);
    }
    
    private void selectedInA(Object selectedInA)
    {
        if (updating)
        {
            return;
        }
        updating = true;
        updateB(selectedInA);
        updating = false;
    }
    
    private void updateB(Object selectedInA)
    {
        comboBoxModelB.removeAllElements();
        comboBoxModelB.addElement("B0,"+selectedInA);
        comboBoxModelB.addElement("B1,"+selectedInA);
        comboBoxModelB.addElement("B2,"+selectedInA);
    }
    
    private void selectedInB(Object selectedInB)
    {
        if (updating)
        {
            return;
        }
        updating = true;
        updateA(selectedInB);
        updating = false;
    }

    private void updateA(Object selectedInB)
    {
        comboBoxModelA.removeAllElements();
        comboBoxModelA.addElement("A0,"+selectedInB);
        comboBoxModelA.addElement("A1,"+selectedInB);
        comboBoxModelA.addElement("A2,"+selectedInB);
    }
    
    
    
}

Die Box1 musst du gar nicht löschen, die hält ja alle “Kategorien”, die ja nur ausgewählt werden.
Box2 braucht “Alles” gar nicht. Wenn sich die Boxen gegenseitig beeinflussen sollen, brauchst neben ActionEvent auch PropertyChange. Änderungen der Listen selbst machst du besser über ComboBoxModel statt direkt ComboBox, natürlich die Auswahl abgreifen bevor der Auswahlliste gelöscht wird. Außerdem erstellst du keine Arrays anhand der ComboBoxen, sondern du hälst mehrere vor, welche die Inhalte der ComboBoxen ausmachen (Array1=Auto, Lkw; Array2=Haus,Turm etc) und je nach Auswahl (Box1) haust halt das entsprechende Array in Box2, und je nach Auswahl in Box2 tust du in Box1 ja auch nur auswählen.