为什么我的Java程序在JTable中一次选择多个复选框?

为什么我的Java程序在JTable中一次选择多个复选框?,java,swing,checkbox,jtable,jcheckbox,Java,Swing,Checkbox,Jtable,Jcheckbox,在向Jtable添加复选框时,或者更具体地说,在选择复选框时,我遇到了一个问题。我可以选择单个复选框,但当我这样做时,它会自动选择其他当前复选框 ex:首先选中,然后选中所有正在进行的复选框。 或者选择第二个,则选择所有程序。 如果选择“最后一个”,则选中上面的所有复选框。 如果我反复单击和取消单击复选框,我最终可以单独选择它们 复选框显示在表的第一列中,每行有一个复选框 我一天来一直在想这个问题,但我不能得出任何结论;因此,我们将非常感谢您的帮助 我的代码如下: 用于创建JTable的源代码:

在向Jtable添加复选框时,或者更具体地说,在选择复选框时,我遇到了一个问题。我可以选择单个复选框,但当我这样做时,它会自动选择其他当前复选框

ex:首先选中,然后选中所有正在进行的复选框。 或者选择第二个,则选择所有程序。 如果选择“最后一个”,则选中上面的所有复选框。 如果我反复单击和取消单击复选框,我最终可以单独选择它们

复选框显示在表的第一列中,每行有一个复选框

我一天来一直在想这个问题,但我不能得出任何结论;因此,我们将非常感谢您的帮助

我的代码如下:

用于创建JTable的源代码:

数据模型中的相关源代码:

由于我的代码可能认为一个actionEvent应用于所有复选框,因此将actionEvent分配给每个复选框是否可能会导致问题


任何帮助都将不胜感激。谢谢。

您知道吗,默认情况下,只需在表模型中重写getColumnClass,表就可以运行?我将尝试一下。但是,这是否消除了将actionListener附加到复选框的可能性?此外,在使用table.getSelectedRow时,通常应在对该行执行操作之前将该视图行转换为实际的模型行。排序和过滤最为重要,但养成习惯是件好事。看,你不需要ActionListener。选中/取消选中时,将调用setValueAt。因此,如果您需要在选中/取消选中时对模型执行某些操作,则可以在此处执行。如果您需要对模型之外的内容进行操作,那么TableModelListener可能会工作,最终会保留DefaultTableCellRenderer=new FormatTableCellRenderer;这可能就是我在那里遇到的问题的原因。
  protected void createTable() {

    JobPlanDataTable dataModel = new JobPlanDataTable();
    dataModel.setTimeOffset( 0 );


    this.ordersTable.setHighlighters(HighlighterFactory.createAlternateStriping());
    this.ordersTable.setAutoCreateColumnsFromModel( false );
    this.ordersTable.setModel( dataModel );
    this.ordersTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    this.ordersTable.setTransferHandler(new TableRowTransferHandler(this.ordersTable)); 

    for( int i = 0; i < dataModel.getColumnCount(); i++ ) {
        if( i== 0 ) {
            TableCellRenderer renderer = new CheckCellRenderer(); 
            ca.cygnusconsulting.utilities.ColumnData col = dataModel.getColumn( i );
            JCheckBox tableCheckBox = new JCheckBox();
            tableCheckBox.setHorizontalAlignment(JCheckBox.CENTER);
            tableCheckBox.setBackground(this.ordersTable.getBackground());
            TableCellEditor editor = new DefaultCellEditor(tableCheckBox);
            TableColumnExt column = new TableColumnExt( i, col.getWidth(), renderer, editor );
            //TableModelListener listener = new TableModelListener();
            column.setMaxWidth(col.getMaxWidth());
            this.ordersTable.addColumn( column );   

            // add action listener on check box
            tableCheckBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {            
                    tableCheckBoxActionPerformed(e);
            }
            });
        }
        else{
        DefaultTableCellRenderer renderer = new FormatTableCellRenderer();
        ca.cygnusconsulting.utilities.ColumnData col = dataModel.getColumn( i );
        renderer.setHorizontalAlignment( col.getAlignment() );
        TableColumnExt column = new TableColumnExt( i, col.getWidth(), renderer, null );
        this.ordersTable.addColumn( column );
        }
    } 
    this.validate();
}   

private void tableCheckBoxActionPerformed(ActionEvent e) {

    int row = this.ordersTable.getSelectedRow();
    System.out.println(row);
    this.changeFlag = true;
}
 public boolean isCellEditable(int rowIndex, int columnIndex) {
    boolean ret = false;
    if( columnIndex == 0 ) {
        ret = true;             
    }
    return ret;
}

   public Object getValueAt(int rowIndex, int columnIndex) {
    Object ret = " ";

    if( rowIndex >= 0 && rowIndex < getRowCount() ) {
        JobPlan obj = (JobPlan)modelData.get( rowIndex );
        switch( columnIndex ) {
            case 0: ret = obj.getGroupFlag();
            break; 
     }
  }

 public Object getObjectAt(int rowIndex) {

    Object obj = null;
    if( rowIndex >= 0 && rowIndex < getRowCount() ) {
          obj = modelData.get( rowIndex );
    }
    return obj;
}

public void setValueAt( Object obj, int row, int col ) {
    // get the object
    JobPlan o = (JobPlan) this.modelData.get( row );
    switch( col ) {
        case 0:
            o.setGroupFlag((Boolean) obj);
        break;
        default: ;
    }
}