【问题标题】:Custom Java ListCellRenderer - Can't click JCheckBox自定义 Java ListCellRenderer - 无法单击 JCheckBox
【发布时间】:2011-02-19 10:57:45
【问题描述】:

制作了一个自定义 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,其中每个单元格都使用上述类呈现,但无法单击面板中每个单元格的复选框。认为这与它没有得到焦点有关。有什么想法吗?

谢谢, 斯宾塞

【问题讨论】:

    标签: java focus jcheckbox listcellrenderer


    【解决方案1】:

    您的自定义渲染器只是控制 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)));

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-07-23
        • 1970-01-01
        • 2011-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-14
        相关资源
        最近更新 更多