为什么我的Java程序在JTable中一次选择多个复选框?
在向Jtable添加复选框时,或者更具体地说,在选择复选框时,我遇到了一个问题。我可以选择单个复选框,但当我这样做时,它会自动选择其他当前复选框 ex:首先选中,然后选中所有正在进行的复选框。 或者选择第二个,则选择所有程序。 如果选择“最后一个”,则选中上面的所有复选框。 如果我反复单击和取消单击复选框,我最终可以单独选择它们 复选框显示在表的第一列中,每行有一个复选框 我一天来一直在想这个问题,但我不能得出任何结论;因此,我们将非常感谢您的帮助 我的代码如下: 用于创建JTable的源代码: 数据模型中的相关源代码: 由于我的代码可能认为一个actionEvent应用于所有复选框,因此将actionEvent分配给每个复选框是否可能会导致问题为什么我的Java程序在JTable中一次选择多个复选框?,java,swing,checkbox,jtable,jcheckbox,Java,Swing,Checkbox,Jtable,Jcheckbox,在向Jtable添加复选框时,或者更具体地说,在选择复选框时,我遇到了一个问题。我可以选择单个复选框,但当我这样做时,它会自动选择其他当前复选框 ex:首先选中,然后选中所有正在进行的复选框。 或者选择第二个,则选择所有程序。 如果选择“最后一个”,则选中上面的所有复选框。 如果我反复单击和取消单击复选框,我最终可以单独选择它们 复选框显示在表的第一列中,每行有一个复选框 我一天来一直在想这个问题,但我不能得出任何结论;因此,我们将非常感谢您的帮助 我的代码如下: 用于创建JTable的源代码:
任何帮助都将不胜感激。谢谢。您知道吗,默认情况下,只需在表模型中重写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: ;
}
}