Auswahllisten mit JComboBox

Hallo zusammen,

ich bin neu was Java angeht… sorry schonmal dafür :slight_smile:

Ich habe bereits eine GUI erstellt mit 2 JComboListen und mein Ziel ist es wenn ich in Liste 1 eine Auswahl treffe dass in Liste 2 dann nur bestimmte Items zur Auswahl stehen…
Also in Liste1 sind Items 1,2,3,4 und in Liste 2 sind 1.1, 1.2, 1.3, 2.1, 2.2, 2.3 wenn ich in Liste 1 1 auswähle soll in Liste 2 nur 1.1, 1.2 und 1.3 auswählbar sein.

hoffe es ist verständlich :slight_smile:

tja, Event auf Selektion in Liste 1, je nachdem was gewählt ist dann Liste 2 beliebig passend neu befüllen?

nur aufpassen dass solche Aktionen nicht auch für sich bereits Selektionen auslösen,
notfalls boolean setzen und in Listener beachten, ‘aktuell ausgeschaltet’

Die Frage taucht in ähnlicher Form immer wieder mal auf. Mal ein schnell hingeschriebenes Beispiel

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

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

public class ConnectedComboBoxesTest
{
    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);
        
        ConnectedComboBoxes c = new ConnectedComboBoxes();
        f.getContentPane().setLayout(new GridLayout(1,0));
        
        f.getContentPane().add(c.getComboBoxA());
        f.getContentPane().add(c.getComboBoxB());
        
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }
    
}


class ConnectedComboBoxes
{
    private final JComboBox<Object> comboBoxA;
    private final JComboBox<Object> comboBoxB;
    
    ConnectedComboBoxes()
    {
        comboBoxA = new JComboBox<Object>();
        comboBoxB = new JComboBox<Object>();
        
        comboBoxA.addItem("1");
        comboBoxA.addItem("2");
        comboBoxA.addItem("3");
        
        comboBoxA.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                updateB(comboBoxA.getSelectedItem());
            }
        });
        
        comboBoxB.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Object selectedInB = comboBoxB.getSelectedItem();
                System.out.println("In B selected " + selectedInB);
            }
        });
        
    }
    
    private void updateB(Object selectedInA)
    {
        System.out.println("In A selected " + selectedInA);
        comboBoxB.removeAllItems();
        if (selectedInA == null)
        {
            return;
        }
        if (selectedInA.equals("1"))
        {
            comboBoxB.addItem("1.1");
            comboBoxB.addItem("1.2");
            comboBoxB.addItem("1.3");
        }
        else if (selectedInA.equals("2"))
        {
            comboBoxB.addItem("2.1");
            comboBoxB.addItem("2.2");
            comboBoxB.addItem("2.3");
        }
        else if (selectedInA.equals("3"))
        {
            comboBoxB.addItem("3.1");
            comboBoxB.addItem("3.2");
            comboBoxB.addItem("3.3");
        }
    }
    
    JComboBox<Object> getComboBoxA()
    {
        return comboBoxA;
    }
    
    JComboBox<Object> getComboBoxB()
    {
        return comboBoxB;
    }
}

Der von SlaterB angedeutete Punkt ist hauptsächlich dann kritisch, wenn zwei ComboBoxen (bzw. allgemein GUI-Elemente) wechselseitig verbunden sind. Das ist hier nicht der Fall.

ABER: Ein paar Punkte sind schon wichtig. Z.B. wird bei der obigen, einfachen Implementierung ggf. ein Event ausgelöst, bei dem in der ComboBox B ein “null”-Element ausgewählt wird. (Schlicht weil bei einer Änderung in A das vorher in B ausgewählte element nicht mehr existiert!).

Auch die Frage, wie die Befüllung stattfindet, ist oben nur GROB angedeutet. Man könnte dort natürlich einfach

            comboBoxB.addItem(selectedInA+".1");
            comboBoxB.addItem(selectedInA+".2");
            comboBoxB.addItem(selectedInA+"2.3");

schreiben, FALLS es um Strings geht, und FALLS das immer so “regelmäßig” aufgebaut ist. Alternativ dazu könnte man, wenn es “viele” mögliche Auswahlen in A gibt, das Füllen von B eleganter und kompakter schreiben, wenn man z.B. die Elemente in einer Map speichern würde, und/oder man mit einem ComboBoxModel arbeiten würde.

Hi,

das ist top… ist zwar ne Menge Schreibkram… aber ist ja einmalig :slight_smile: ein NULL Element kann eh nicht passieren da das ganze nachher in eine db geschrieben werden soll wo diese beiden Felder nicht leer sein dürfen…

Danke Euche :slight_smile:

Das mit dem Null-Element war - wenn ich das richtig verstehe - so gemeint:

  1. Du klickt in Tabelle 1 auf “1”
  2. Du klickt in Tabelle 2 auf “1.3”
  3. Du klickst in Tabelle 1 auf “2”
  4. Du klickst auf OK

-> Dann ist der Wert aus der zweiten Tabelle null, da es dort nun keine “1.3” mehr gibt.

ok… dann sollte aber der ganze Eintrag in der db nicht gespeichert werden können weil Feld den Wert NOT NULL hat… dann müsste der Nutzer also merken dass etwas nicht stimmt…
ggfs muss ich mal googlen wie ich eine Fehlermeldung ausspucken lassen kann dass das Feld nicht leer sein kann… Danke für den Hinweis Crian

Einfacher wäre es, in der Methode, die auf den Klick von OK reagiert, einfach zu prüfen ob einer der beiden Werte vielleicht null ist und eine Fehlermeldung anzuzeigen, ohne den Dialog zu verlassen. Das kannst du dort ja schon wissen, dass das nicht gut ist, ohne auf eine Fehlermeldung aus der Datenbank zu warten.

räusper

[QUOTE=Marco13]ABER: Ein paar Punkte sind schon wichtig. Z.B. wird bei der obigen, einfachen Implementierung ggf. ein Event ausgelöst, bei dem in der ComboBox B ein “null”-Element ausgewählt wird. (Schlicht weil bei einer Änderung in A das vorher in B ausgewählte element nicht mehr existiert!).
[/QUOTE]

Ja, Möglichkeiten, das zu lösen, gibt es tausende. Und dieser null-Event wird ja auch nur “zwischendurch” ausgelöst, d.h. der Nutzer sollte nie eine “ungültige” Konfiguration sehen (also, es steht nie sichtbar “null” in der ComboBox). Und wenn es noch einen “OK”-Button gibt, ist die Frage vielleicht gar nicht so relevant…