1 | package genius.gui.panels;
|
---|
2 |
|
---|
3 | import java.awt.BorderLayout;
|
---|
4 | import java.awt.Dimension;
|
---|
5 |
|
---|
6 | import javax.swing.DefaultListCellRenderer;
|
---|
7 | import javax.swing.JComboBox;
|
---|
8 | import javax.swing.JLabel;
|
---|
9 | import javax.swing.JPanel;
|
---|
10 | import javax.swing.ListCellRenderer;
|
---|
11 | import javax.swing.event.ListDataEvent;
|
---|
12 | import javax.swing.event.ListDataListener;
|
---|
13 |
|
---|
14 | /**
|
---|
15 | * A GUI that shows panel with given title at the left and a combobox at the
|
---|
16 | * right. In the combo, the user can select an item from a list. This panel
|
---|
17 | * hides automatically if there are no selectable items.
|
---|
18 | *
|
---|
19 | * The text label is set fixed to 120 pixels to get some nice column layout
|
---|
20 | *
|
---|
21 | * @param <ItemType>
|
---|
22 | * the type of the elements in the item list.
|
---|
23 | */
|
---|
24 | @SuppressWarnings("serial")
|
---|
25 | public class ComboboxSelectionPanel<ItemType> extends JPanel {
|
---|
26 |
|
---|
27 | private SingleSelectionModel<ItemType> model;
|
---|
28 | final JComboBox<ItemType> combo;
|
---|
29 |
|
---|
30 | /**
|
---|
31 | *
|
---|
32 | * @param title
|
---|
33 | * the text to be placed left of the combo box
|
---|
34 | * @param itemsModel
|
---|
35 | * the {@link SingleSelectionModel} that contains the possible
|
---|
36 | * choices and can be listened for changes.
|
---|
37 | */
|
---|
38 | public ComboboxSelectionPanel(final String title,
|
---|
39 | final SingleSelectionModel<ItemType> itemsModel) {
|
---|
40 | this.model = itemsModel;
|
---|
41 | setLayout(new BorderLayout());
|
---|
42 | combo = new JComboBox<ItemType>(itemsModel);
|
---|
43 |
|
---|
44 | JLabel label = new JLabel(title);
|
---|
45 | // sets a FIXED (not preferred?) size for these.
|
---|
46 | label.setPreferredSize(new Dimension(120, 10));
|
---|
47 | add(label, BorderLayout.WEST);
|
---|
48 | add(combo, BorderLayout.CENTER);
|
---|
49 | updateVisibility();
|
---|
50 |
|
---|
51 | itemsModel.addListDataListener(new ListDataListener() {
|
---|
52 |
|
---|
53 | @Override
|
---|
54 | public void intervalRemoved(ListDataEvent e) {
|
---|
55 | updateVisibility();
|
---|
56 | }
|
---|
57 |
|
---|
58 | @Override
|
---|
59 | public void intervalAdded(ListDataEvent e) {
|
---|
60 | updateVisibility();
|
---|
61 | }
|
---|
62 |
|
---|
63 | @Override
|
---|
64 | public void contentsChanged(ListDataEvent e) {
|
---|
65 | updateVisibility();
|
---|
66 | }
|
---|
67 |
|
---|
68 | });
|
---|
69 | }
|
---|
70 |
|
---|
71 | /**
|
---|
72 | * We are visible only if there is at least one possible selection. This
|
---|
73 | * enables us to hide eg the Mediator combobox by just emptying the mediator
|
---|
74 | * list in the model.
|
---|
75 | */
|
---|
76 | private void updateVisibility() {
|
---|
77 | // FIXME invokelater
|
---|
78 | setVisible(model.getSize() > 0);
|
---|
79 | }
|
---|
80 |
|
---|
81 | /**
|
---|
82 | * Set the cell renderer.
|
---|
83 | *
|
---|
84 | * @param renderer
|
---|
85 | * a {@link DefaultListCellRenderer}. Note, for unknown reason,
|
---|
86 | * {@link DefaultListCellRenderer} implements
|
---|
87 | * {@link ListCellRenderer}<object> and ignores the proper
|
---|
88 | * typing
|
---|
89 | */
|
---|
90 | public void setCellRenderer(DefaultListCellRenderer renderer) {
|
---|
91 | combo.setRenderer(renderer);
|
---|
92 | }
|
---|
93 |
|
---|
94 | }
|
---|