如何在"JTable"列中仅使一个复选框处于选中状态 [英] How to make only one checkbox selectable in JTable Column
问题描述
我正在使用DefaultTableModel,如下所示:
I am using DefaultTableModel as follows:
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);
}
};
现在,我只想在选定"列中选择一个复选框.如何才能做到这一点.我也尝试了以下方法,但不起作用.
Now I want to make only one checkbox selectable in the column "Selected". How can this be done. I have tried following method also but its not working.
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方法的示例代码.
@eatSleepCode wrote @mKorbel can you please give example code for implementing setValueAt method.
(使用OP的)DefaultTableModel代码,
code for (OP used) DefaultTableModel,
用于基于
AbstractTableModel
的代码来保存通知程序fireTableCellUpdated(rowIndex, columnIndex)
;的代码顺序,因为/否则在JTables view
中不会重绘任何内容,for code based on
AbstractTableModel
is required to hold code ordering for notifierfireTableCellUpdated(rowIndex, columnIndex)
;, because/otherwise nothing will be repainted inJTables view
,这两个模型及其通知者之间有一些重要的区别,而且(我认为)没有理由为基本内容(99pct的表模型)而烦恼并使用
AbstractTableModel
p>
there are a few important differencies betweens those two models and its notifiers, and (my view) there isn't reason to bothering with and to use
AbstractTableModel
for basic stuff (99pct of table models). . . . . . . .
. . . . . . . .
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(); } }); } }
这篇关于如何在"JTable"列中仅使一个复选框处于选中状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!