繁体   English   中英

jtable复选框单选java摆动

[英]jtable checkbox single selection java swing

我有一张桌子。 我把复选框放在一列中。 但是该复选框处于多选模式,即在我的jtable中有5个复选框。 我可以选择5中的5。我一次只能选择1。 如何将其更改为单选?

我的代码是这样的:

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

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

提前致谢。

这是一个TableModel,它在现有表的末尾引入了一个选择复选框列。 你可以像这样安装它

CheckBoxSelectionTableModel.register(table);

您可以尝试使用SimpleTableDemo - 它将如下所示,并使所选行与复选框保持同步。

在此输入图像描述

它仅需要将现有表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());     
  }


}

在表模型中,当5列值之一设置为true时,您应该将当前为true的值设置为false,并为该列触发表模型事件。

您还应该考虑使用单选按钮作为渲染器和编辑器,因为它是表示唯一选择的最合适的组件。

另一种方法是将这5列替换为一个,然后使用组合框作为单元格编辑器。

我想建议你另一种方法,

看看JRadioButton ,我想这将是一个更好的选择。

注意:摘自如何使用按钮,复选框和单选按钮

复选框类似于单选按钮,但按照惯例,它们的选择模型不同。 可以选择组中的任意数量的复选框-无,全部或全部。 另一方面,一组单选按钮只能选择一个按钮。

我只是在寻找一些解决此问题的方法,于是我找到了解决方案……希望它能对某人有所帮助。

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM