Пользовательский Java ListCellRenderer - Не могу нажать JCheckBox - PullRequest
0 голосов
/ 14 мая 2010

Сделал пользовательский ListCellRenderer:

import java.awt.Component;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.ListCellRenderer;

/**
 *
 * @author Spencer
 */
public class TaskRenderer implements ListCellRenderer {

    private Task task;

    private JPanel panel = new JPanel();
    private JCheckBox checkbox = new JCheckBox();
    private JLabel label = new JLabel();

    public TaskRenderer() {
        panel.add(checkbox);
        panel.add(label);
    }

    public Component getListCellRendererComponent(
            JList list,
            Object value,
            int index,
            boolean isSelected,
            boolean cellHasFocus) {
        task = (Task) value;
        label.setText(task.getName());
        return panel;
    }

}

Иметь JList с каждой ячейкой в ​​нем, отображаемой с использованием вышеуказанного класса, но флажки на панелях для каждой ячейки нельзя щелкнуть. Думал, что это связано с тем, что он не получил фокус. Есть идеи?

Спасибо, Спенсер

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

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

Я бы порекомендовал решить проблему:

  1. Используйте JTable с одним столбцом вместо JList.
  2. Определите сделанную на заказ реализацию TableModel путем подкласса AbstractTableModel и переопределите getColumnClass (int), чтобы вернуть Boolean.class для столбца 0. Обратите внимание, что средство визуализации по умолчанию теперь будет отображать это как JCheckBox. Однако это не будет помеченный JCheckBox, как вам требуется.
  3. Добавить сделанный на заказ TableCellRenderer для Booleans; например myTable.setCellRenderer (Boolean.class, новый MyLabelledCheckBoxRenderer ());
  4. Добавить редактор для логических выражений, используя нечто похожее на: myTable.setCellEditor (Boolean.class, new DefaultEditor (new JCheckBox ("Is Enabled)));
0 голосов
/ 28 мая 2010

Общий слой JIDE имеет подпись GPL CheckBoxList . В основном он использует JPanel в качестве средства визуализации ячеек с JCheckBox перед другим средством визуализации (которое вы можете установить самостоятельно) и обрабатывает события мыши / клавиши.

Если вы действительно хотите придерживаться своего рендерера JCheckBox, вы можете прослушивать события мыши / клавиши и обрабатывать их соответствующим образом. Имейте в виду, что, как указал Адамски, средство визуализации ячеек - это штамп (Swing 101), поэтому вы всегда должны устанавливать выбранное состояние флажка в getListCellRendererComponent(), иначе все ваши флажки будут иметь состояние сохранения.

...