jtable флажок одиночный выбор java swing - PullRequest
1 голос
/ 12 января 2012

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

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

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

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

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

Ответы [ 4 ]

1 голос
/ 12 января 2012

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

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

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

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

1 голос
/ 07 мая 2014

Вот TableModel, который вводит один столбец флажка выбора в конце существующей таблицы.Вы можете установить его так:

CheckBoxSelectionTableModel.register(table);

. Вы можете попробовать SimpleTableDemo - он будет выглядеть следующим образом и синхронизирует выбранную строку с флажком.

enter image description here

Требуется, чтобы существующая таблица Model была экземпляром 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 голос
/ 12 января 2012

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

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

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

0 голосов
/ 08 октября 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...