我有一个jtable。我把复选框放在一列中。但复选框处于多选模式,即在我的jtable中有5个复选框。我可以选择5中的5个。我想一次只选择1个。 如何将其更改为单一选择?
我的代码就像:
TableColumn colTable2 = jTable2.getColumnModel().getColumn(1);
colTable2.setCellEditor(new DefaultCellEditor(jCheckBox2));
colTable2.setCellRenderer(jTable2.getDefaultRenderer(Boolean.class));
提前致谢。
答案 0 :(得分:1)
在表模型中,当5列值之一设置为true时,您应该将当前为true的值设置为false,并为该列触发表模型事件。
您还应该考虑使用单选按钮作为渲染器和编辑器,因为它是表示唯一选择的最合适的组件。
替代方法是将这5列替换为单个列,并使用组合框作为单元格编辑器。
答案 1 :(得分:1)
我想建议你另一种方法,
看看JRadioButton,我想这将是一个更好的选择。
注意,来自How to Use Buttons, Check Boxes, and Radio Buttons
复选框与单选按钮类似,但按照惯例,它们的选择模型不同。可以选择组中的任意数量的复选框 - 无,部分或全部。另一方面,一组单选按钮只能选择一个按钮。
答案 2 :(得分:1)
这是一个TableModel,它在现有表的末尾引入了一个选择复选框列。 您可以像这样安装
CheckBoxSelectionTableModel.register(table);
您可以尝试SimpleTableDemo - 它将如下所示,并使所选行与复选框保持同步。
它只需要现有的表Model是 javax.swing.table.AbstractTableModel 的实例 - 这将是>的情况。 80%。
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
public class CheckBoxSelectionTableModel implements TableModel, ListSelectionListener {
protected final AbstractTableModel delegate;
protected int selectedRow = -1;
protected final ListSelectionModel selectionModel;
public CheckBoxSelectionTableModel(AbstractTableModel delegate, ListSelectionModel selectionModel) {
this.delegate = delegate;
this.selectionModel = selectionModel;
selectionModel.addListSelectionListener(this);
}
public static void register(JTable table) {
table.setModel(new CheckBoxSelectionTableModel((AbstractTableModel)table.getModel(), table.getSelectionModel()));
}
protected boolean isCheckBoxCloumn(int columnIndex) {
return columnIndex == getCheckBoxColumnIndex();
}
protected int getCheckBoxColumnIndex() {
return delegate.getColumnCount();
}
// --------------------- delegate methods --------------------- \\
public int getRowCount() {
return delegate.getRowCount();
}
public int getColumnCount() {
return getCheckBoxColumnIndex()+1;
}
public String getColumnName(int columnIndex) {
return isCheckBoxCloumn(columnIndex) ? "" : delegate.getColumnName(columnIndex);
}
public Class<?> getColumnClass(int columnIndex) {
return isCheckBoxCloumn(columnIndex) ? Boolean.class : delegate.getColumnClass(columnIndex);
}
public boolean isCellEditable(int rowIndex, int columnIndex) {
return isCheckBoxCloumn(columnIndex) ? true : delegate.isCellEditable(rowIndex, columnIndex);
}
public Object getValueAt(int rowIndex, int columnIndex) {
return isCheckBoxCloumn(columnIndex) ? rowIndex == selectedRow : delegate.getValueAt(rowIndex, columnIndex);
}
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if(isCheckBoxCloumn(columnIndex)) {
int lastSelected = selectedRow;
if((Boolean) aValue){
selectedRow = rowIndex;
} else {
selectionModel.clearSelection();
selectedRow = -1;
}
if(lastSelected > -1) {
delegate.fireTableRowsUpdated(lastSelected, lastSelected);
}
delegate.fireTableRowsUpdated(rowIndex, rowIndex);
} else {
delegate.setValueAt(aValue, rowIndex, columnIndex);
}
}
public void addTableModelListener(TableModelListener l) {
delegate.addTableModelListener(l);
}
public void removeTableModelListener(TableModelListener l) {
delegate.removeTableModelListener(l);
}
// --------------------- ListSelectionListener methods --------------------- \\
@Override
public void valueChanged(final ListSelectionEvent e) {
if(e.getValueIsAdjusting()){
return;
}
int index = selectionModel.getLeadSelectionIndex();
boolean isSelected = selectionModel.isSelectedIndex(index);
setValueAt(isSelected ,index , getCheckBoxColumnIndex());
}
}
答案 3 :(得分:0)
我只是在为这个问题寻找一些东西,我来到这个解决方案......希望它可以帮助别人。
private void MiTablaMouseClicked(java.awt.event.MouseEvent evt) {
for(int i=0; i<MiTabla.getRowCount(); i++){
if(i==MiTabla.getSelectedRow()){
MiTabla.setValueAt(true, MiTabla.getSelectedRow(), 0);
}else{
MiTabla.setValueAt(false, i, 0);
}
}
}