私はフレームにシンプルJFrame
とAを持っています。JTable
ユーザーは、テーブルの行にデータを提供できます。要件の 1 つは、フレームを閉じた後に新しいデータを保存または破棄できることです。この動作を実現する最も簡単な方法は次のとおりだと思いました。
フレームのメソッドをオーバーライドし、のデータ ベクトル
setVisible()
を複製します。DefaultTableModel
フレームに を追加
WindowListener
し、イベントに反応しWindowClosing
ます。このようにして、ウィンドウ リスナーは、モデルを以前に保存されたモデルにリセットする必要があるかどうかを判断できます。
関連するコード スニペットは次のとおりです。
@Override
public void setVisible(boolean b) {
//save the original models only if setVisible invoked with true (do not save the model when hiding the frame)
if (b) {
Vector cloned = (Vector) userTableModel.getDataVector().clone();
Vector headerNames = new Vector();
originalModel = new CustomTableModel(cloned, headerNames);
}
super.setVisible(b);
}
実は、おかしなことが起こっています。データ ベクトルを複製した後、テーブルをレンダリングできず、次の例外が発生します。
スレッド「AWT-EventQueue-0」での例外 java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 java.util.Vector.elementAt(Vector.java:470) で javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:650) で asc.model.CustomTableModel.getValueAt (CustomTableModel.java:74) で javax.swing.JTable.getValueAt(JTable.java:2720) で
この表は、 とはまったく関係がありませんoriginalModel
。理論的には、複製がテーブルのモデルに影響を与えるべきではないので、これは私にとって驚きです。originalModel の意図は、新しく作成されたテーブル モデルのコピーへの参照を保持することです。の作成をコメントアウトした後originalModel
、すべてが正常に機能しました。
もう 1 つの興味深い点はString
、headerNames
ベクターに空を追加すると、テーブル レンダラーがほぼ同じArrayIndexOutOfBounds
例外をスローすることですが、次のようになります。
スレッド「AWT-EventQueue-0」での例外 java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
その場合、最初の行の最初の列は完全にレンダリングされました。
MyCustomTableModel
は から拡張されてDefaultTableModel
おり、特別なメソッドは使用していません。コンストラクターは、単にデータ ベクトルとヘッダー ベクトルをスーパークラスに渡します。
誰かが問題を解決するのを手伝ってくれることを願っています。前もって感謝します。