自定义Java ListCellRenderer - 无法单击JCheckBox

时间:2010-05-14 09:28:03

标签: 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 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 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

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

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