這是一個TableModel,它在現有表的末尾引入了單選框複選框列。 您可以安裝它像這樣
CheckBoxSelectionTableModel.register(table);
你可以把它放在SimpleTableDemo一個嘗試 - 它看起來像以下,並保持選定的行同步與複選框。
它僅需要現有的表型是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());
}
}
複選框被選中或不選 - 我看不到任何複選框。換句話說,你是什麼_mean_? – kleopatra 2012-01-12 07:12:40
在我的jtable中有5個複選框。我可以選擇5中的5個。我想一次只選擇1個。 – Rounak 2012-01-12 07:21:28
感謝您的澄清 - 您可能會考慮編輯您的問題,並在其中添加其他信息 – kleopatra 2012-01-12 07:29:57