[英]How to make only one checkbox selectable in JTable Column
我正在使用DefaultTableModel,如下所示:
DefaultTableModel model = new DefaultTableModel (COLUMNS, 0 )
{
@Override
public boolean isCellEditable(int row, int column)
{
return (getColumnName(column).equals("Selected"));
}
public Class getColumnClass(int columnIndex)
{
if(getColumnName(columnIndex).equals("Selected"))
return Boolean.class;
return super.getColumnClass(columnIndex);
}
};
现在,我只想在“选定”列中选择一个复选框。 如何才能做到这一点。 我也尝试了以下方法,但无法正常工作。
public void fireTableCellUpdated(int row,int column)
{
if(getColumnName(column).equals("Selected"))
{
for(int i = 0; i<getRowCount() && i!=row;i++)
setValueAt(Boolean.FALSE, row, column);
}
}
@eatSleepCode写道@mKorbel能否请您给出实现setValueAt方法的示例代码。
(使用OP的)DefaultTableModel的代码,
需要基于AbstractTableModel
代码来保存通知程序fireTableCellUpdated(rowIndex, columnIndex)
代码顺序;因为/否则,在JTables view
不会重绘任何内容,
这两个模型及其通知者之间有一些重要的区别,而且(我认为)没有理由为基本的东西(99pct的表模型)烦恼和使用AbstractTableModel
。
。 。 。 。 。 。 。 。
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
public class TableRolloverDemo {
private JFrame frame = new JFrame("TableRolloverDemo");
private JTable table = new JTable();
private String[] columnNames = new String[]{"Column"};
private Object[][] data = new Object[][]{{false}, {false}, {true}, {true},
{false}, {false}, {true}, {true}, {false}, {false}, {true}, {true}};
public TableRolloverDemo() {
final DefaultTableModel model = new DefaultTableModel(data, columnNames) {
private boolean ImInLoop = false;
@Override
public Class<?> getColumnClass(int columnIndex) {
return Boolean.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 0) {
if (!ImInLoop) {
ImInLoop = true;
Boolean bol = (Boolean) aValue;
super.setValueAt(aValue, rowIndex, columnIndex);
for (int i = 0; i < this.getRowCount(); i++) {
if (i != rowIndex) {
super.setValueAt(!bol, i, columnIndex);
}
}
ImInLoop = false;
}
} else {
super.setValueAt(aValue, rowIndex, columnIndex);
}
}
};
table.setModel(model);
table.setPreferredScrollableViewportSize(table.getPreferredSize());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
TableRolloverDemo tableRolloverDemo = new TableRolloverDemo();
}
});
}
}
由于setValueAt()方法一次又一次触发fireTableCellUpdated()方法,因此会出现堆栈溢出异常。
而是尝试使用表侦听器,该侦听器将侦听复选框的值更改并将所有其他复选框的值设置为false。
您可以创建自己的自定义单元格编辑器,该编辑器将ButtonGroup
一列中的所有复选框连接ButtonGroup
。 这是如何做:
public class VeryComplicatedCellEditor extends DefaultCellEditor {
private ArrayList<ButtonGroup> groups;
public getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
JCheckBox checkBox = new JCheckBox();
growToSize(column);
groups.get(column).add(checkBox);
return checkBox;
}
private growToSize(int size) {
groups.ensureCapacity(size);
while (groups.size() < size)
groups.add(new ButtonGroup());
}
}
由于我们不知道表有多大,因此产生了一些复杂性,这些复杂性通常在growToSize
方法中得到了growToSize
。
它的工作方式是维护一个ButtonGroup
的列表,每列一个。 每个单元格的编辑器组件将添加到其列的按钮组中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.