У меня есть jtable. Я поставил флажок в столбце. Но флажок находится в режиме множественного выбора, т.е. в моем jtable есть 5 флажков. я могу выбрать 5 из 5. Я хочу выбрать только 1 за раз. Как я могу изменить его на одиночный выбор?
Мой код похож:
TableColumn colTable2 = jTable2.getColumnModel().getColumn(1);
colTable2.setCellEditor(new DefaultCellEditor(jCheckBox2));
colTable2.setCellRenderer(jTable2.getDefaultRenderer(Boolean.class));
Заранее спасибо.
4 ответа
В вашей табличной модели, когда для одного из 5 столбцов установлено значение true, вы должны установить тот, который в настоящее время является истинным, равным false и запустить событие табличной модели для этого столбца.
Вы также должны рассмотреть возможность использования переключателя в качестве средства визуализации и редактирования, так как это наиболее подходящий компонент для представления уникального выбора.
Альтернативой является замена этих 5 столбцов одним и использование поля со списком в качестве редактора ячеек.
Я хотел бы предложить вам альтернативный подход,
Взгляните на JRadioButton, я думаю, это будет лучшим вариантом.
Примечание , из Как использовать кнопки, флажки и переключатели
Флажки аналогичны переключателям, но их модель выбора по соглашению отличается. Можно выбрать любое количество флажков в группе — ни одного, некоторые или все. С другой стороны, группа переключателей может иметь только одну выбранную кнопку.
Вот 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());
}
}
Я просто искал что-то для этой проблемы, и я пришел к этому решению... надеюсь, что это кому-то поможет.
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);
}
}
}
Похожие вопросы
Связанные вопросы
Новые вопросы
java
Java — это высокоуровневый объектно-ориентированный язык программирования. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег часто используется вместе с другими тегами для библиотек и/или фреймворков, используемых разработчиками Java.