Java GUI Swing Jlist с тремя компонентами

Мне нужно создать Java Swing JList с тремя компонентами.

Каждая строка JList должна иметь один JCheckBox, один ImageIcon и один JLabel. Проблема в том, что JLabel может иметь только два элемента. Поэтому мне нужен метод для добавления JCheckBox...

Jlist с тремя компонентами: -

введите здесь описание изображения


person Torben G    schedule 06.04.2016    source источник
comment
JTable приходит на ум. Начните с изучения Концепции: редакторы и визуализаторы и Написание пользовательского средства визуализации ячеек для получения дополнительных идей.   -  person MadProgrammer    schedule 06.04.2016
comment
Проблема в том, что JLabel может иметь только два элемента — это не имеет смысла.   -  person MadProgrammer    schedule 06.04.2016
comment
Спасибо, я имею в виду, что вы можете создать собственный модуль визуализации ячеек и расширить его от jlabel, который может иметь значок и текст. Но мне тоже нужен флажок. Итак, я попытался создать собственный JComponent...   -  person Torben G    schedule 06.04.2016
comment
Хорошо, вы на правильном пути, в чем проблема?   -  person MadProgrammer    schedule 06.04.2016


Ответы (1)


Без какой-либо реальной информации лучшее, что я могу предложить, это начать с просмотра Концепции: редакторы и визуализаторы и написание Custom Cell Renderer для того, как работает рендеринг ячеек.

Основываясь на ваших основных требованиях, вам нужно начать с какого-то класса контейнера и добавить к нему свои компоненты, затем вам нужно будет заполнять значения компонентов каждый раз, когда getListCellRendererComponent вызывается данными, которые он предоставляет.

Вам также нужно будет позаботиться о рендеринге выбора, так как обычно об этом заботится DefaultListCellRenderer

Например...

Позвольте представить вам моих маленьких друзей

public static class CustomListCellRenderer extends JPanel implements ListCellRenderer<Data> {

    private static final Border DEFAULT_NO_FOCUS_BORDER = new EmptyBorder(1, 1, 1, 1);

    private JCheckBox checkBox;
    private JLabel label;

    public CustomListCellRenderer() {
        setOpaque(false);

        setLayout(new FlowLayout(FlowLayout.LEFT));

        setBorder(DEFAULT_NO_FOCUS_BORDER);

        checkBox = new JCheckBox();
        label = new JLabel();

        checkBox.setOpaque(false);

        add(checkBox);
        add(label);
    }

    @Override
    public Component getListCellRendererComponent(JList<? extends Data> list, Data value, int index, boolean isSelected, boolean cellHasFocus) {
        checkBox.setSelected(value.isSelecetd());
        label.setIcon(new ImageIcon(value.getImage()));
        label.setText(value.getText());
        Color fg = list.getForeground();
        if (isSelected) {
            setBackground(list.getSelectionBackground());
            fg = list.getSelectionForeground();
        }
        label.setForeground(fg);
        setOpaque(isSelected);
        Border border = null;
        if (cellHasFocus) {
            if (isSelected) {
                border = UIManager.getBorder("List.focusSelectedCellHighlightBorder");
            }
            if (border == null) {
                border = UIManager.getBorder("List.focusCellHighlightBorder");
            }
        } else {
            border = DEFAULT_NO_FOCUS_BORDER;
        }
        setBorder(border);
        return this;
    }

}
person MadProgrammer    schedule 06.04.2016
comment
Большое спасибо ! Этот код отлично работает для меня. Я немного отредактировал, но это работает! Я так счастлив. Спасибо - person Torben G; 06.04.2016
comment
Вы знаете, я смотрю на это и задаю себе вопрос — по какой причине кто-то должен голосовать против этого? Каким образом это не отвечает на вопрос ОП? Каким образом можно улучшить ответ? Поскольку новый ответ не был предоставлен, я могу только предположить, что: 1- Вы не понимаете вопроса; 2- Вы не понимаете ответа 3- У вас нет лучшего представления о том, как решить проблему - person MadProgrammer; 30.12.2017