0

JTable と DefaultModel を使用してスプレッドシートを実装しています。私の問題は、数式を入力し、モデルの値を更新して、model.fireupdate と table changed イベントの間のループに入るようにしたいときです。TableModelEvent を削除してから追加しようとしましたが、機能しません。コンソールに新しい計算値を出力しているため、スプレッドシートは正常に更新されます。例:

セルに 2+3 を入力します

コンソールにスプレッドシートのセル値が表示されます = 5 正常に動作します

Jtable セルにはまだ 2+3 と表示され、セルを更新しようとしているため、例外が発生します。

ご入力いただきありがとうございます。

public void tableChanged(TableModelEvent e) {

    final int i = e.getFirstRow();
    final int j = e.getColumn();
    TableModel model = (TableModel) e.getSource();

    final Object data = model.getValueAt(i, j);

    if (e.getType() == TableModelEvent.UPDATE) {
        my_spreadSheet.editCell(i, j, (String) data); // updating spreadsheet cell here 
                                                      // and calculating it  This works ok
    }

     my_table.setValueAt(                                        // trying to update the jtable
     my_spreadSheet.getCellContent(jtbl_row, jtbl_col), i, j);   // here causes error.

}
4

1 に答える 1

0

さてこれが答えです。私はこれを試したことを誓うことができました!!! それは私のコメントにもありますが、私が間違っていたのは、テーブルリスナーが削除されている間にテーブルを更新しなかったことです。Wierdモデルリスナーも削除されたと思いました!

@Override
public void tableChanged(TableModelEvent e) {
     my_table.getModel().removeTableModelListener(this);

    final int i = e.getFirstRow();
    final int j = e.getColumn();
    TableModel model = (TableModel) e.getSource();

    final Object data = model.getValueAt(i, j);


    if (e.getType() == TableModelEvent.UPDATE) {
        my_spreadSheet.editCell(i, j, (String) data);
        my_table.setValueAt(
                my_spreadSheet.getCellValue(i, j), i, j);

    }

    my_table.getModel().addTableModelListener(this);
}
于 2012-11-30T00:01:41.663 に答える