Следующий ListCellRenderer не получает события щелчка во вложенных ComboBox. Мне нужно что-то включать?
class FilterCellRenderer implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
Filter filter = (Filter)value;
JPanel filterPanel = new JPanel();
FlowLayout layout = new FlowLayout();
layout.setAlignment(FlowLayout.LEFT);
filterPanel.setLayout(layout);
filterPanel.add(new JLabel(filter.getLabel()));
final List<Object> options = filter.getOptions();
if (options.size() > 1) {
JComboBox optionCombo = new JComboBox(new AbstractComboBoxModel() {
public int getSize() {
return options.size();
}
public Object getElementAt(int index) {
return options.get(index);
}
});
optionCombo.setSelectedItem(filter.getValue());
filterPanel.add(optionCombo);
}
if (isSelected) {
filterPanel.setBackground(list.getSelectionBackground());
filterPanel.setForeground(list.getSelectionForeground());
}
return filterPanel;
}
}




Это немного сложно. Я считаю, что вам нужно заменить JList одним столбцом JTable. Затем установите редактор ячеек таблицы, а также средство визуализации. IIRC, может быть проблема с потерей первого щелчка (который используется для выбора редактируемой ячейки).
Также рекомендуется повторно использовать компоненты между каждым вызовом getCellRendererComponent. Компоненты используются в качестве штампа, а затем выбрасываются. Если их каждый раз воссоздавать, производительность будет ужасной.
Компоненты рендерера в свинге работают как «резиновые штампы» - они просто используются для рендеринга / рисования значения и не добавляются в родительский контейнер обычным способом (просто подумайте, как один компонент может быть добавлен в нескольких местах!).
Похоже, вам может понадобиться редактор, а не средство визуализации (редактор - это полноценный компонент, добавляемый в одном месте в любой момент времени). В противном случае вам придется вместо этого установить MouseListener в JList.
Поскольку мне не нужно было выбирать строки, я просто динамически добавлял элементы и в JPanel с настраиваемым макетом. Допускается полное поведение компонентов без взлома таблицы.