2012-01-12 58 views
1

我有一个jtable。我把复选框放在一列中。但复选框处于多选模式,即在我的jtable中有5个复选框。我可以选择5中的5个。我想一次只选择1个。 如何将其更改为单选?jtable复选框单选java旋转

我的代码是这样的:提前

TableColumn colTable2 = jTable2.getColumnModel().getColumn(1); 

colTable2.setCellEditor(new DefaultCellEditor(jCheckBox2)); 
colTable2.setCellRenderer(jTable2.getDefaultRenderer(Boolean.class)); 

感谢。

+0

复选框被选中或不选 - 我看不到任何复选框。换句话说,你是什么_mean_? – kleopatra 2012-01-12 07:12:40

+0

在我的jtable中有5个复选框。我可以选择5中的5个。我想一次只选择1个。 – Rounak 2012-01-12 07:21:28

+0

感谢您的澄清 - 您可能会考虑编辑您的问题,并在其中添加其他信息 – kleopatra 2012-01-12 07:29:57

回答

1

在您的表模型中,当5列值之一设置为true时,您应该将当前为true的值设置为false,并为此列启动表模型事件。

您还应该考虑使用单选按钮作为渲染器和编辑器,因为它是表示唯一选择的最合适的组件。

另一种方法是用一个单独替换这5列,并使用组合框作为单元格编辑器。

1

我想建议你另一种方法,

看一看JRadioButton,我想这将是一个更好的选择。

注意,从How to Use Buttons, Check Boxes, and Radio Buttons

复选框类似于单选按钮,但他们的选择模型是不同的,按照约定。可以选择组中的任何数量的复选框 - 无,部分或全部。另一方面,一组单选按钮只能选择一个按钮。

1

这是一个TableModel,它在现有表的末尾引入了单选框复选框列。 您可以安装它像这样

CheckBoxSelectionTableModel.register(table); 

你可以把它放在SimpleTableDemo一个尝试 - 它看起来像以下,并保持选定的行同步与复选框。

enter image description here

它仅需要现有的表型是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());  
    } 


} 
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); 
     } 
    } 

}