package org.esa.snap.ui.color; import org.junit.Ignore; import javax.swing.AbstractListModel; import javax.swing.Icon; import javax.swing.JComponent; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.ListCellRenderer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.WindowConstants; import javax.swing.border.LineBorder; import javax.swing.table.DefaultTableModel; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Component; import java.awt.Graphics; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @Ignore public class ColorSelectionTest { public static void main(String[] args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException e) { e.printStackTrace(); } DefaultTableModel dm = new DefaultTableModel(new Object[][]{ {"C1", Color.RED}, {"C2", Color.GREEN}, {"C3", Color.BLUE}}, new String[]{"Name", "Color"}) { @Override public Class<?> getColumnClass(int columnIndex) { return columnIndex == 0 ? String.class : Color.class; } }; JTable table = new JTable(dm); ColorTableCellEditor editor = new ColorTableCellEditor(); ColorTableCellRenderer renderer = new ColorTableCellRenderer(); table.setDefaultEditor(Color.class, editor); table.setDefaultRenderer(Color.class, renderer); table.getModel().addTableModelListener(e -> System.out.println("e = " + e)); ColorComboBox colorComboBox1 = new ColorComboBox(Color.YELLOW); ColorComboBox colorComboBox2 = new ColorComboBox(Color.GREEN); colorComboBox2.setColorChooserPanelFactory(CustomColorChooserPanel::new); JFrame frame = new JFrame("Color Selection Test"); frame.setLocation(200, 100); frame.add(colorComboBox1, BorderLayout.NORTH); frame.add(new JScrollPane(table), BorderLayout.CENTER); frame.add(colorComboBox2, BorderLayout.SOUTH); frame.pack(); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setVisible(true); } private static List<ColorItem> getColorItems() { List<ColorItem> colors = new ArrayList<>(); List<String> names = ColorCodes.getNames(); colors.addAll(names.stream().map(name -> new ColorItem(name, ColorCodes.getColor(name))).collect(Collectors.toList())); return colors; } static class ColorItem { String name; Color color; public ColorItem(String name, Color color) { this.name = name; this.color = color; } } private static class ColorItemListCellRenderer extends JLabel implements ListCellRenderer<ColorItem> { @Override public Component getListCellRendererComponent(JList<? extends ColorItem> list, ColorItem value, int index, boolean isSelected, boolean cellHasFocus) { setIcon(new ColorItemIcon(value)); setText(value.name); setBorder(isSelected ? new LineBorder(Color.ORANGE, 2) : new LineBorder(Color.WHITE, 2)); return this; } private static class ColorItemIcon implements Icon { private final ColorItem value; public ColorItemIcon(ColorItem value) { this.value = value; } @Override public void paintIcon(Component c, Graphics g, int x, int y) { g.setColor(value.color); g.fillRect(0, 0, getIconWidth(), getIconHeight()); } @Override public int getIconWidth() { return 32; } @Override public int getIconHeight() { return 16; } } } private static class CustomColorChooserPanel extends ColorChooserPanel { public CustomColorChooserPanel(Color selectedColor) { super(selectedColor); } @Override protected JComponent createColorPicker() { List<ColorItem> colors = getColorItems(); JList<ColorItem> view = new JList<>(new AbstractListModel<ColorItem>() { @Override public int getSize() { return colors.size(); } @Override public ColorItem getElementAt(int index) { return colors.get(index); } }); view.setCellRenderer(new ColorItemListCellRenderer()); view.addListSelectionListener(e -> { setSelectedColor(view.getSelectedValue().color); }); return new JScrollPane(view); } } }