1) JTable默认已经具备内置的JCheckbox和Boolean TableCellRenderers and TableCellEditor,因此不需要再声明其相关内容。
2) AbstractTableModel应该很有用,在JTable
中,可以通过它来减少/限制/更改继承自DefaultTableModel
的嵌套方法。
3) 考虑使用DefaultTableModel
(如果您对其工作原理不确定),而不是AbstractTableModel
。
可以从简单的代码生成:
import javax.swing.*;
import javax.swing.table.*;
public class TableCheckBox extends JFrame {
private static final long serialVersionUID = 1L;
private JTable table;
public TableCheckBox() {
Object[] columnNames = {"Type", "Company", "Shares", "Price", "Boolean"};
Object[][] data = {
{"Buy", "IBM", new Integer(1000), new Double(80.50), false},
{"Sell", "MicroSoft", new Integer(2000), new Double(6.25), true},
{"Sell", "Apple", new Integer(3000), new Double(7.35), true},
{"Buy", "Nortel", new Integer(4000), new Double(20.00), false}
};
DefaultTableModel model = new DefaultTableModel(data, columnNames);
table = new JTable(model) {
private static final long serialVersionUID = 1L;
/*@Override
public Class getColumnClass(int column) {
return getValueAt(0, column).getClass();
}*/
@Override
public Class getColumnClass(int column) {
switch (column) {
case 0:
return String.class;
case 1:
return String.class;
case 2:
return Integer.class;
case 3:
return Double.class;
default:
return Boolean.class;
}
}
};
table.setPreferredScrollableViewportSize(table.getPreferredSize());
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableCheckBox frame = new TableCheckBox();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setLocation(150, 150);
frame.setVisible(true);
}
});
}
}
JTable#getColumnClass
方法会执行以下操作:return getModel().getColumnClass(convertColumnIndexToModel(column));
。如果用户移动表格列,这个"解决方案"将会失效。应该重写TableModel#getColumnClass
方法。 - Dennis
setCellEditor( layersTable.getDefaultEditor( Boolean.class ) )
和单元格渲染器。 PS. 很遗憾这个问题已经关闭了,我无法回答,这是一个非常适合快速回答的问题 :( - Line