2012-01-12 60 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); 
     } 
    } 

}