JComboBoxen synchronisieren

G

GaSprechung18

Gast
Hi,

ich habe in meinem Programm 3 ComboBoxen. Alle haben eigentlich den selben Inhalt. Deshalb ist es zur Zeit noch möglich, 3 mal den selben Eintrag zu wählen. Ziel ist es, das wenn ein Eintrag selektiert wurde, dann soll dieser Eintrag bei den anderen verschwinden.

Gibt es da irgend ne "einfache" Lösung dazu? Ich hatte mir mal überlegt, an jede CB nen Listener zu hängen und dann wenn was ausgewählt wurde, bei den anderen CB's zu filtern. Das erscheint mir aber doch recht aufwändig. Oder ist das die eizige Lösung?

Danke im Vorraus für die Hilfe :)
 
S

SlaterB

Gast
einfacher und sauberer ist es, allen drei dasselbe Model zuzuorden,
wenn du ein eigenes verwendest, dann eben nicht 3x erstellen,

ansonsten irgendwo am Anfang getModel() 1x und setModel() 2x aufrufen
 
S

SlaterB

Gast
tja, das bringt mich zu Zweifeln, aber mehr als zweifeln kann ich da nicht,

hast du noch einen Hinweis für mich, warum das so ist?,
hast du einen Hinweis für GaSprechung18 zu einer anderen Lösung?
welchen Zweck hat ansonsten dieses 'Glaubensbekenntnis'?

edit:
ok, jetzt habe ich es,
> dann soll dieser Eintrag bei den anderen verschwinden.
habe ich als
'dann soll dieser Eintrag bei den anderen auch selektiert sein'
dann bringt meine Lösung gewiss nicht viel

edit:
jetzt schreibst du es ja auch ;)
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
ja ok, das macht es interessanter,
Listener mit bisschen remove() untereinander wäre dann wohl die einfachste Lösung,

kann man bisschen aufwendiger gestalten mit allgemeinen Lösungen gegenseitig registrierer Verkünpfungen a la ButtonGroup statt individuellen Code in den Listenern,
aber wirklich anders wird das kaum
 

André Uhres

Top Contributor
Hallo GaSprechung18,

versuch's mal so:

Java:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.util.List;
import javax.swing.*;
public class FilteringComboBoxDemo {
    private final JComboBox comboBox1;
    private final JComboBox comboBox2;
    private final JComboBox comboBox3;
    public FilteringComboBoxDemo() {
        final JPanel contentPane = new JPanel();
        String[] values = new String[]{"a", "b", "c", "d", "e", "f", "g"};
        //create combobox 1
        FilteringComboBoxModel model = new FilteringComboBoxModel(values);
        comboBox1 = new JComboBox(model);
        contentPane.add(comboBox1);
        //create combobox 2
        model = new FilteringComboBoxModel(values.clone());
        comboBox2 = new JComboBox(model);
        contentPane.add(comboBox2);
        //create combobox 3
        model = new FilteringComboBoxModel(values.clone());
        comboBox3 = new JComboBox(model);
        contentPane.add(comboBox3);
        comboBox1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent e) {
                filter(1);
            }
        });
        comboBox2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent e) {
                filter(2);
            }
        });
        comboBox3.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(final ActionEvent e) {
                filter(3);
            }
        });
        final JFrame f = new JFrame("FilteringComboBox Demo");
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setSize(new Dimension(400, 300));
        f.setLocationRelativeTo(null);
        f.setContentPane(contentPane);
        f.setVisible(true);
    }
    private void filter(final int i) {
        Object selectedItem1 = comboBox1.getSelectedItem();
        Object selectedItem2 = comboBox2.getSelectedItem();
        Object selectedItem3 = comboBox3.getSelectedItem();
        FilteringComboBoxModel model1 = (FilteringComboBoxModel) comboBox1.getModel();
        FilteringComboBoxModel model2 = (FilteringComboBoxModel) comboBox2.getModel();
        FilteringComboBoxModel model3 = (FilteringComboBoxModel) comboBox3.getModel();
        if (i == 1) {
            model2.filter(selectedItem1, selectedItem3);
            model3.filter(selectedItem1, selectedItem2);
        } else if (i == 2) {
            model1.filter(selectedItem2, selectedItem3);
            model3.filter(selectedItem1, selectedItem2);
        } else {
            model1.filter(selectedItem2, selectedItem3);
            model2.filter(selectedItem1, selectedItem3);
        }
    }
    private static class FilteringComboBoxModel extends DefaultComboBoxModel {
        private final String[] values;
        private List<String> fileredValues = new ArrayList<String>();
        FilteringComboBoxModel(final String[] values) {
            this.values = values.clone();
            fileredValues.addAll(Arrays.asList(values));
        }
        public void filter(final Object selected1, final Object selected2) {
            if (selected1 == null && selected2 == null) {
                return;
            }
            final String newValue1 = (String) selected1;
            final String newValue2 = (String) selected2;
            final int oldSize = fileredValues.size();
            if (oldSize != 0) {
                fileredValues.clear();
            }
            for (final String test : values) {
                if (newValue1 != null && newValue2 != null) {
                    if (!test.equals(newValue1) && !test.equals(newValue2)) {
                        fileredValues.add(test);
                    }
                } else if (newValue1 != null) {
                    if (!test.equals(newValue1)) {
                        fileredValues.add(test);
                    }
                } else {
                    if (!test.equals(newValue2)) {
                        fileredValues.add(test);
                    }
                }
            }
            fireContentsChanged(this, 0, fileredValues.size() - 1);
        }
        @Override
        public Object getElementAt(final int index) {
            return fileredValues.get(index);
        }
        @Override
        public int getSize() {
            return fileredValues.size();
        }
    }
    public static void main(final String... args) {
        Runnable gui = new Runnable() {
            @Override
            public void run() {
                FilteringComboBoxDemo filteringComboBoxDemo = new FilteringComboBoxDemo();
            }
        };
        SwingUtilities.invokeLater(gui);
    }
}

Gruß,
André
 
G

GSprechung18

Gast
Hey,

vielen Dank für die Antworten. Die Lösung klappt prima.. :)

danke für die Mühe
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
R Auswahl mehrerer JComboBoxen verknüpfne AWT, Swing, JavaFX & SWT 17
S Probleme mit JComboboxen(?) AWT, Swing, JavaFX & SWT 18
it_is_all Swing Mehrere JComboBoxen - wie die versch. Boxen mit ItemStateChange auslesen? AWT, Swing, JavaFX & SWT 3
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
A Swing zwei JComboBoxen miteinander vergleichen und anschließend Button umwandeln AWT, Swing, JavaFX & SWT 7
I Wie mehrere JComboBoxen in Abhängigkeit einer anderen Box ändern? AWT, Swing, JavaFX & SWT 8
M auslesen mehrerer JComboBoxen funktioniert nicht AWT, Swing, JavaFX & SWT 9
F JTable Spalte sortieren mit lauter JComboboxen ? AWT, Swing, JavaFX & SWT 15
G Zwei JComboBoxen AWT, Swing, JavaFX & SWT 5
S mehrere JComboBoxen und ActionListener AWT, Swing, JavaFX & SWT 7
H JComboBoxen dynamisch erzeugen AWT, Swing, JavaFX & SWT 3
B TableCellRenderer + JComboBoxen AWT, Swing, JavaFX & SWT 2
S Swing Tabelle mit Model bei eingeschaltetem Filter synchronisieren AWT, Swing, JavaFX & SWT 6
B Swing Synchronisieren oder nicht? AWT, Swing, JavaFX & SWT 4
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
T Swing 2 Tabellen parallel sortieren? (synchronisieren) AWT, Swing, JavaFX & SWT 3
G Swing JTable und JTextArea synchronisieren AWT, Swing, JavaFX & SWT 2
C JTable , 2 Comboboxen synchronisieren AWT, Swing, JavaFX & SWT 2
E JTable sortieren und synchronisieren von zwei Datenvektoren AWT, Swing, JavaFX & SWT 2
J JCheckBoxMenuItem und JCheckBox synchronisieren AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben