ListCellRenderer не запускает события для дочерних компонентов

Следующий 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;
    }

}
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
856
3

Ответы 3

Это немного сложно. Я считаю, что вам нужно заменить JList одним столбцом JTable. Затем установите редактор ячеек таблицы, а также средство визуализации. IIRC, может быть проблема с потерей первого щелчка (который используется для выбора редактируемой ячейки).

Также рекомендуется повторно использовать компоненты между каждым вызовом getCellRendererComponent. Компоненты используются в качестве штампа, а затем выбрасываются. Если их каждый раз воссоздавать, производительность будет ужасной.

Компоненты рендерера в свинге работают как «резиновые штампы» - они просто используются для рендеринга / рисования значения и не добавляются в родительский контейнер обычным способом (просто подумайте, как один компонент может быть добавлен в нескольких местах!).

Похоже, вам может понадобиться редактор, а не средство визуализации (редактор - это полноценный компонент, добавляемый в одном месте в любой момент времени). В противном случае вам придется вместо этого установить MouseListener в JList.

Поскольку мне не нужно было выбирать строки, я просто динамически добавлял элементы и в JPanel с настраиваемым макетом. Допускается полное поведение компонентов без взлома таблицы.

Другие вопросы по теме