ListCellRenderer не запускает события для дочерних компонентов - PullRequest
0 голосов
/ 09 октября 2008

Следующий ListCellRenderer не получает события щелчка во вложенных комбинированных списках. Нужно ли что-то включать?

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;
    }

}

Ответы [ 3 ]

1 голос
/ 10 октября 2008

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

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

1 голос
/ 11 октября 2008

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

0 голосов
/ 09 октября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...