是否可以将JCheckBoxes放入不包含布尔值的JTable单元格中?

时间:2017-08-08 13:42:34

标签: java swing user-interface checkbox jtable

我知道如果你把它的类设置为布尔值,JTable中的表格单元会自动获得一个Checkbox。

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

https://i.stack.imgur.com/AfJ5x.png

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

3 个答案:

答案 0 :(得分:3)

是。将数字和布尔属性聚合为单个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());

image

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

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

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);
 }
}