2

JTableにあるJCheckBoxにリスナーを追加しています。次のコードに問題があります。

public class CheckBoxEditor extends DefaultCellEditor implements ItemListener {

private static final long serialVersionUID = 1L;
private JCheckBox checkBox;

private int row;
private int column;

public CheckBoxEditor(JCheckBox checkBox) {
    super(checkBox);
    this.checkBox = checkBox;
    this.checkBox.addItemListener(this);
}

@Override
public Component getTableCellEditorComponent(JTable table, Object value,
        boolean isSelected, int row, int column) {
    this.row = row;
    this.column = column;
    checkBox.setSelected((Boolean) value);
    return super.getTableCellEditorComponent(table, value, isSelected, row, column);
}

public void itemStateChanged(ItemEvent e) {
    this.fireEditingStopped();
    System.out.println("Item Changed " + row + " value is: " + checkBox.isSelected());
}

}

そして、私は上記のクラスを次のように使用しています。

tableA.getColumnModel().getColumn(4).setCellEditor(new CheckBoxEditor(new JCheckBox()));

列のチェックボックスをクリックするたびに、itemStateChangedメソッドに到達します。問題は、チェックボックスを選択すると、itemStateChangedメソッドが2回呼び出され、場合によっては1回だけ呼び出されることです。

これはサンプル出力です。(私は5行ありました。そして、すべてのチェックボックスを真にするとき、私はこの二重のsyso印刷を取得しています。)

Item Changed 0 value is: true

Item Changed 1 value is: false

Item Changed 1 value is: true

Item Changed 2 value is: false

Item Changed 2 value is: true

Item Changed 3 value is: false

Item Changed 3 value is: true

Item Changed 4 value is: false

Item Changed 4 value is: true
4

1 に答える 1

4

チェックボックスをクリックしたときだけでなく、APIを介して選択した状態が変更されたときにもリスナーがトリガーされます。

また、エディターは常に同じチェックボックスを再利用するため、選択した値を常に更新しています。

主な質問は...なぜリスナーをそれに接続する必要があるのでしょうか?

于 2012-11-10T12:58:23.113 に答える