Code
class DropdownTableComboBox<E extends List<Object>> extends JComboBox<E> {
protected final transient HighlightListener highlighter = new HighlightListener();
protected final JTable table = new JTable() {
@Override public Component prepareRenderer(
TableCellRenderer renderer, int row, int column) {
Component c = super.prepareRenderer(renderer, row, column);
c.setForeground(Color.BLACK);
if (highlighter.isHighlightableRow(row)) {
c.setBackground(new Color(255, 200, 200));
} else if (isRowSelected(row)) {
c.setBackground(Color.CYAN);
} else {
c.setBackground(Color.WHITE);
}
return c;
}
@Override public void updateUI() {
removeMouseListener(highlighter);
removeMouseMotionListener(highlighter);
super.updateUI();
addMouseListener(highlighter);
addMouseMotionListener(highlighter);
getTableHeader().setReorderingAllowed(false);
}
};
protected final List<E> list;
protected DropdownTableComboBox(List<E> list, DefaultTableModel model) {
super();
this.list = list;
table.setModel(model);
list.forEach(this::addItem);
// list.forEach(model::addRow);
list.forEach(v -> model.addRow(v.toArray(new Object[0])));
}
@Override public void updateUI() {
super.updateUI();
EventQueue.invokeLater(() -> {
setUI(new MetalComboBoxUI() {
@Override protected ComboPopup createPopup() {
return new ComboTablePopup(comboBox, table);
}
});
setEditable(false);
});
}
public List<Object> getSelectedRow() {
return list.get(getSelectedIndex());
}
}
References