0

制作了一个自定义 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,但无法单击面板中每个单元格的复选框。认为它与它没有得到焦点有关。有任何想法吗?

谢谢,斯宾塞

4

2 回答 2

2

您的自定义渲染器只是控制 JList 内容的外观,而不是添加任何功能,例如修改组件的能力(复选框) - 将其简单地想象为用于依次显示每个列表单元格的橡皮图章。

我建议通过以下方式解决问题:

  1. 使用单列 JTable 而不是 JList。
  2. 通过对 AbstractTableModel 进行子类化并覆盖 getColumnClass(int) 来定义定制的 TableModel 实现以返回第 0 列的 Boolean.class。请注意,默认渲染器现在将其渲染为 JCheckBox。但是,它不会是您需要的标记 JCheckBox。
  3. 为布尔值添加定制的 TableCellRenderer;例如 myTable.setCellRenderer(Boolean.class, new MyLabelledCheckBoxRenderer());
  4. 为布尔值添加一个编辑器,使用类似于: myTable.setCellEditor(Boolean.class, new DefaultEditor(new JCheckBox("Is Enabled)));
于 2010-05-14T10:25:42.057 回答
0

JIDE 公共层有一个 GPL 的CheckBoxList。基本上,它使用 JPanel 作为单元格渲染器,在另一个渲染器(您可以自己设置)前面有一个 JCheckBox,并处理鼠标/键事件。

If you really want to stick to your JCheckBox renderer, you can listen to mouse/key events and process them appropriately. Keep in mind that, as Adamski pointed out, cell renderer is a rubber stamp (Swing 101) so you have to always set the check box selected state in getListCellRendererComponent(), otherwise all your checkboxes will have the save state.

于 2010-05-28T17:15:57.673 回答