2

私は AbstractTableModel から離れたテーブルを持っています。テーブル内のデータはベクターに格納されます。行を削除すると、ベクトルから正常に削除されますが、これはビュー、つまり GUI で更新されません。

fireTableRowsDeleted() を使用する必要があることを他の場所で読みましたが、AbstractTableModel のラッパー メソッド内でそれを呼び出そうとしています。

dataModel = new AbstractTableModel() {
          public void removeAl() {
                  fireTableRowsDeleted(0, getRowCount()-1);
          }
};

しかし、この removeAl にはアクセスできません。どこでもこのように呼び出すことはできません:dataModel.removeAl()

何が問題なのかを理解するのを手伝ってもらえますか? 行の削除時に GUI を更新するにはどうすればよいですか?

編集: 結局のところ、問題は別の場所にありました。それを修正したら、Vector 自体から行を削除すると、GUI の更新が開始されました。:)

4

2 に答える 2

3

mdmaが言ったことに加えて、TableModelインターフェイスから次のメソッドをオーバーライドする必要もあります(これらはによって実装されないままになります)。したがって、これらのメソッドをオーバーライドしない限り、サブクラスAbstractTableModelをインスタンス化することはできません。AbstractTableModel

public int getRowCount();
public int getColumnCount();
public Object getValueAt(int row, int column);

最後に、メソッドでtableRowsDeletedを起動するremoveAll()だけでは不十分であり、前の3つのメソッドが返すものに影響を与える必要があります。つまり、removeAll()が呼び出された後、getRowCount()が0を返すことを確認する必要があります。そうしないと、問題が発生します(NullPointerExceptionまたは、最悪の場合は同等でJTable、最良の場合は問題を更新します)。

たぶんDefaultTableModel、最初のステップで使用したほうがいいかもしれません。そうすれば、たぶん簡単になります。から派生するのAbstractTableModelは後で来るでしょう。それはあなたが実際に何をしたいかにかなり依存します...

于 2010-08-13T06:11:50.217 に答える
1

メソッドが匿名クラスで宣言されているため、removeAllメソッドが表示されません。匿名クラスは名前で参照できず、その中の新しい宣言にはアクセスできません。そのため、匿名クラスの public 宣言は、非匿名の基本クラスを使用することで利用できるため、通常はオーバーライドになります。

これを修正するには、テーブル モデルを通常のサブクラスとして宣言します。AbstractTableModel

public class MyTableModel extends AbstractTableModel {

   public void removeAll() {
      fireTableRowsDeleted(...);
   }
}

クライアント コードは、メソッドにアクセスするために MyTableModel にキャストする必要がありますremoveAll()

より単純ではあるが貧弱な解決策は、引き続きクライアントに を使用させAbstractTableModel、クライアントに明示的に を呼び出させることfireTableRowsDeleted()です。

于 2010-08-13T00:31:39.113 に答える