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

时间:2014-11-05 16:15:34

标签: java swing checkbox jtable jcheckbox

向Jtable添加复选框时会出现问题,或者更具体地说,在选中复选框时会出现问题。我可以选择单个复选框,但是当我这样做时会自动选择其他复选框。

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

复选框出现在表格的第一列,每行都有一个复选框。

我一直试图弄清楚这一天,我无法得出任何结论;所以一些帮助将不胜感激。

我的代码如下:

创建JTable的来源:

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

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

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

0 个答案:

没有答案