向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应用于所有复选框?
任何帮助将不胜感激。谢谢。