自定义Java ListCellRenderer-Can';t单击JCheckBox

自定义Java ListCellRenderer-Can';t单击JCheckBox,java,focus,jcheckbox,listcellrenderer,Java,Focus,Jcheckbox,Listcellrenderer,创建自定义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 TaskRende

创建自定义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中的每个单元格,但无法单击面板中每个单元格的复选框。我想这和没有集中注意力有关。有什么想法吗

谢谢,
Spencer

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

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

  • 使用单列JTable而不是JList
  • 通过对AbstractTableModel进行子分类并重写getColumnClass(int)以返回列0的Boolean.class,定义定制的TableModel实现。请注意,默认渲染器现在将此渲染为JCheckBox。但是,它不会按照您的要求标记为JCheckBox
  • 为布尔人添加定制的TableCellRenderer;e、 g.myTable.setCellRenderer(Boolean.class,新的MyLabelledCheckBoxRenderer())
  • 使用类似于myTable.setCellEditor(Boolean.class,new DefaultEditor(new JCheckBox(“Is Enabled”))的东西为布尔添加编辑器
  • 有一个GPL'ed。基本上它使用一个JPanel作为单元渲染器,在另一个渲染器前面有一个JCheckBox(你可以自己设置),并处理鼠标/按键事件

    如果你真的想坚持使用JCheckBox渲染器,你可以监听鼠标/按键事件并适当地处理它们。请记住,正如Adamski指出的,单元格渲染器是一个橡皮图章(Swing 101),因此你必须始终在
    GetListCellRenderComponent()中设置复选框selected状态
    ,否则所有复选框都将处于保存状态