【问题标题】:Is it possible to put JCheckBoxes in JTable cells, which do NOT contain booleans?是否可以将 JCheckBoxes 放在不包含布尔值的 JTable 单元格中?
【发布时间】:2018-01-16 03:00:02
【问题描述】:

我知道如果您将 JTable 中的表格单元格设置为布尔值,它会自动获得一个复选框。

但是,我的 JTable 中有一个列,其中包含整数值。是否可以将复选框添加到那些(非布尔)单元格中,就像我在这里糟糕的绘图中一样:

我的目标不是检查这些列的真/假值,而是选择相应的表行并对其进行处理。我知道我可以在我的 ListSelectionModel 中使用多个选择间隔,但我发现复选框更有吸引力。

【问题讨论】:

  • 为什么不能再创建一个布尔列并将其命名为selection 以保留复选框逻辑?

标签: java swing user-interface checkbox jtable


【解决方案1】:

是的。将数字和布尔属性聚合到单个 Value 并提供合适的 renderer and editor。然后,您对getColumnClass() 的实现将为相关列返回Value.class。使用Double 的完整示例见here,检查here 并在下面说明。概括地说,

class Value implements Comparable<Value> {

    private Boolean selected;
    private Integer value;

    public Value(Boolean selected, Double value) {
        this.selected = selected;
        this.value = value;
    }
    …
}

class ValueRenderer extends JCheckBox
    implements TableCellRenderer {

    @Override
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected,
        boolean hasFocus, int row, int col) {
        Value v = (Value) value;
        this.setSelected(v.selected);
        this.setText(df.format(v.value));
        …
        return this;
    }
}

class ValueEditor extends AbstractCellEditor implements TableCellEditor, ItemListener {

    private ValueRenderer vr = new ValueRenderer();

    public ValueEditor() {
        vr.addItemListener(this);
    }

    @Override
    public Object getCellEditorValue() {
        return vr.isSelected();
    }
    …
}
…
table.setDefaultRenderer(Value.class, new ValueRenderer());
table.setDefaultEditor(Value.class, new ValueEditor());

【讨论】:

  • 当我这样做时,我得到一个 ClassCastException,因为我无法从 String 转换为 Value... 我尝试将 Value-class 中的值更改为 String,但我仍然不能像这。那么我怎样才能用字符串而不是双精度或整数来实现同样的效果呢?
  • 验证您的TableModel 确实包含Value 的实例,并且有一个返回Value.classgetColumnClass() 实现。
  • 啊,我忘了改变我的 getValueAt 方法,现在可以了,非常感谢!
  • 我现在无法选择复选框...我必须更改哪种方法,以便我可以选择复选框并监听其真/假状态的变化?
  • 检查isCellEditable()的实现。
【解决方案2】:

一种方法是覆盖表模型中的getColumnClass() 方法。 See JavaDoc.

另一个是自己的TableCellEditor和/或TableCellRenderer

【讨论】:

    【解决方案3】:

    为什么不直接创建一个包含标签和复选框的新类并将其添加到您的表格中?

    import java.awt.*;
    
    import javax.swing.*;
    
    public class LabelWithCheckBox extends JPanel{
    
    public LabelWithCheckBox(String text){
        setLayout(new GridBagLayout());
        JLabel jLabel = new JLabel(text);
        JCheckBox checkBox = new JCheckBox();
    
        add(jLabel, new GridBagConstraints(
                0, 0, 1, 1, 1.0, 1.0,
                GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets(0, 0, 0, 0),
                0, 0
        ));
    
        add(checkBox, new GridBagConstraints(
                1, 0, 1, 1, 1.0, 1.0,
                GridBagConstraints.WEST, GridBagConstraints.NONE,
                new Insets(0, 0, 0, 0),
                0, 0
        ));
    }
    
     public static void main(String args[]){
         JFrame frame = new JFrame();
         frame.add(new LabelWithCheckBox("Label text"));
         frame.setVisible(true);
         frame.setSize(100, 50);
     }
    }
    

    【讨论】:

    • (1-) 这不是 JTable 的工作方式。 JTable 使用渲染器来显示数据。
    • @camickr 是的,也许我应该更清楚地说明您将通过渲染器添加它,而不仅仅是假设 OP 会知道如何添加。
    • 渲染器无济于事,因为它只是绘制数据。它不是一个真正的组件。它不允许您“单击”复选框。
    • @camickr 我明白了!然后我误解了它到底做了什么。
    猜你喜欢
    • 2016-02-03
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-18
    • 2011-09-10
    • 2011-09-29
    相关资源
    最近更新 更多