У меня есть jtable. Я поставил флажок в столбце. Но флажок находится в режиме множественного выбора, т.е. в моем jtable есть 5 флажков. я могу выбрать 5 из 5. Я хочу выбрать только 1 за раз. Как я могу изменить его на одиночный выбор?

Мой код похож:

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

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

Заранее спасибо.

1
Rounak 12 Янв 2012 в 11:01
Флажок либо установлен, либо нет - я ничего не вижу. Другими словами: что вы имеете в виду?
 – 
kleopatra
12 Янв 2012 в 11:12
В моем jtable есть 5 флажков. я могу выбрать 5 из 5. Я хочу выбрать только 1 за раз.
 – 
Rounak
12 Янв 2012 в 11:21
Спасибо за разъяснение - вы можете отредактировать свой вопрос и добавить туда дополнительную информацию
 – 
kleopatra
12 Янв 2012 в 11:29
Эта логика принадлежит вашей TableModel: в setValueAt, которая устанавливает соответствующее значение в true, проверьте, какое значение является текущим true, и установите для него значение false
 – 
kleopatra
12 Янв 2012 в 11:33
@kleopatra:: Большое спасибо... Я сделал это с помощью функции setValueAt.
 – 
Rounak
12 Янв 2012 в 12:48

4 ответа

В вашей табличной модели, когда для одного из 5 столбцов установлено значение true, вы должны установить тот, который в настоящее время является истинным, равным false и запустить событие табличной модели для этого столбца.

Вы также должны рассмотреть возможность использования переключателя в качестве средства визуализации и редактирования, так как это наиболее подходящий компонент для представления уникального выбора.

Альтернативой является замена этих 5 столбцов одним и использование поля со списком в качестве редактора ячеек.

1
JB Nizet 12 Янв 2012 в 11:34

Я хотел бы предложить вам альтернативный подход,

Взгляните на JRadioButton, я думаю, это будет лучшим вариантом.

Примечание , из Как использовать кнопки, флажки и переключатели

Флажки аналогичны переключателям, но их модель выбора по соглашению отличается. Можно выбрать любое количество флажков в группе — ни одного, некоторые или все. С другой стороны, группа переключателей может иметь только одну выбранную кнопку.

1
COD3BOY 12 Янв 2012 в 12:13

Вот 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());     
  }


}
1
culmat 7 Май 2014 в 18:44

Я просто искал что-то для этой проблемы, и я пришел к этому решению... надеюсь, что это кому-то поможет.

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

}
0
Gonzalo Atán 8 Окт 2016 в 22:45