# Combobox und Enum



## Patt1502 (6. Mrz 2018)

```
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Main extends JPanel {

    private static final long serialVersionUID = 1L;
    String SIGNAL = "Signal";
    private List<JComboBox<ComboColor>> comboList = new ArrayList<>();

    public Main() {
        setLayout(new GridLayout(0, 1));

        DefaultComboBoxModel<ComboColor> cModel = new DefaultComboBoxModel<>(ComboColor.values());
        JComboBox<ComboColor> combo = new JComboBox<>(cModel);
        JComboBox<ComboColor> combo2 = new JComboBox<>(cModel);
        add(createComboLabelPanel(1, combo));
        comboList.add(combo);
       
        add(createComboLabelPanel(2, combo2));
        comboList.add(combo2);

    }

    private JPanel createComboLabelPanel(int index, JComboBox<ComboColor> combo) {
        JPanel panel = new JPanel();
        JLabel label = new JLabel(SIGNAL + " " + index);
        label.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        label.setOpaque(true);
        combo.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent evt) {
                ComboColor cColor = (ComboColor) combo.getSelectedItem();
                label.setBackground(cColor.getColor());
            }
        });

        panel.add(label);
        panel.add(combo);
        return panel;
    }

    public static void main(String[] args) {
        Main mainPanel = new Main();

        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.getContentPane().add(mainPanel);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);

    }
}

enum ComboColor {
    RED("Red", Color.RED), GREEN("Green", Color.GREEN), BLUE("Blue", Color.BLUE);

    private String text;
    private Color color;

    public String getText() {
        return text;
    }

    public Color getColor() {
        return color;
    }

    private ComboColor(String text, Color color) {
        this.text = text;
        this.color = color;
    }

    @Override
    public String toString() {
        return text;
    }
}
```

Das ist ein kleines Programm weitesgehend aus dem Internet, von dem ich aber Teile in meinem Programm benutzen möchte. Hier werden jeweils 2 ComboBoxen mit dem Enum ComboColor gefüllt, wenn ich das Programm dann laufen lasse, ändern sich aber beide Werte, wenn ich nur einen der beiden ändere. D.h, wenn ich in der ersten ComboBox green auswähle, steht in der zweiten dann auch green. Ich habe lange überlegt, aber ich versteh einfach nicht wieso sich beide Werte gleichzeitig ändern.
Danke im Vorraus


----------



## Flown (6. Mrz 2018)

Patt1502 hat gesagt.:


> DefaultComboBoxModel<ComboColor> cModel = *new* DefaultComboBoxModel<>(ComboColor.values());
> JComboBox<ComboColor> combo = *new* JComboBox<>(cModel);
> JComboBox<ComboColor> combo2 = *new* JComboBox<>(cModel);


Beide verwenden das gleiche ComboBoxModel.


----------



## X5-599 (6. Mrz 2018)

Kurz gesagt: Es liegt daran, daß beide ComboBoxen das selbe Model benutzen. Beim Hinzufügen des Models zur ComboBox wird die ComboBox beim Model als "ListDataListener" registriert.
Das Model hat in deinem Beispiel nun zwei solche "ListDataListener", die auch beide beim z.B. Ändern des selected Items benachrichtigt werden. Das äußert sich in dem für beide "ListDataListener" ein ActionEvent erzeugt und gefeuert wird.


----------



## Patt1502 (6. Mrz 2018)

Super Sache, danke euch beiden fürs erklären, jetzt geht's.


----------

