我知道如果你把它的类设置为布尔值,JTable中的表格单元会自动获得一个Checkbox。
但是,我的JTable中有一个包含整数值的列。是否可以将复选框添加到那些(非布尔)单元格中,就像在我的糟糕绘图中一样:
我的目标不是检查这些列的真/假值,而是选择相应的表行并对它们执行某些操作。我知道我可以在ListSelectionModel中使用多个选择间隔,但我发现它对复选框更有吸引力。
答案 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());
答案 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);
}
}