2

JTable で行を選択すると、JTable が更新されなくなりました。行を選択しないと、下のコードは期待どおりに機能します。JTable に行が追加されます。

    @Override
public void update (Observable arg0, Object arg1)
{
    if (arg0 instanceof Logger)
    {
        LogItem last = systemController.logController.getLog().getLastLogItem();
        this.history.add(last);
        this.logTableModel.addItem(last);

        this.logTable.tableChanged(new TableModelEvent(this.logTableModel));
        ((DefaultTableModel)this.logTable.getModel()).fireTableStructureChanged();
        this.logTable.repaint();
        this.logTable.doLayout();
    }

}

ウィンドウを閉じて再度開くと、新しい行が表示されます。

行を選択した後、JTable に更新が表示されなくなった理由を説明してもらえますか?

4

2 に答える 2

3

コードには多くの問題があります。これは、テーブルデータ自体ではなくテーブル構造(列の数など)の変更(行の追加、セル値の変更など)に関連しているため、fireTableStructureChangedを呼び出さないでください。また、モデルの変更によってトリガーされるため、テーブル自体でrepaintとdoLayoutを呼び出す必要はありません。

Javaチュートリアルの「テーブルの使用方法」、特にテーブルモデルの使用、データ変更のリッスン、データ変更イベントの発生を確認する必要があると思います。

于 2009-03-16T23:33:44.450 に答える
0

update() 呼び出しは Swing イベント スレッドで発生していますか? そうでない場合は、コードを次のようにラップする必要があります。

SwingUtilities.invokeLater(new Runnable() { public void run() {
  logTableModel.addItem(last);
}});
于 2009-03-16T23:38:35.013 に答える