私は単純なJFrame
とJTable
をフレームに持っています。 ユーザーは、テーブルの行にデータを入力できます。要件の1つは、フレームを閉じた後に新しいデータを保存または破棄できることです。フレームのDefaultTableModelのdataVectorのクローニングに関する問題
オーバーライド
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);
}
。私はデータベクトルのクローンを作成した後、テーブルをレンダリングすることができないと、これは次の例外につながる:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0 >= 0 at java.util.Vector.elementAt(Vector.java:470) at javax.swing.table.DefaultTableModel.getValueAt(DefaultTableModel.java:650) at asc.model.CustomTableModel.getValueAt(CustomTableModel.java:74) at javax.swing.JTable.getValueAt(JTable.java:2720)
の表は、どのような方法でoriginalModel
への接続ではありません。理論的には、クローニングはテーブルのモデルに影響を与えるべきではないので、私にとっては驚きです。 originalModelの目的は、新しく作成されたテーブルモデルのコピーへの参照を保持することです。 originalModel
の作成をコメントした後、すべて正常に機能しました。
もう一つ興味深いのは、私はheaderNames
ベクトルに空String
を追加したとき、テーブルレンダラがほぼ同じArrayIndexOutOfBounds
例外がスローされますが、この結末である:
、の最初の列最初の行が完全にレンダリングされる
私のCustomTableModel
はDefaultTableModel
から拡張されており、特別な方法は使用していません。コンストラクタは、単にデータベクトルとヘッダベクトルをスーパークラスに渡します。
誰かが問題の解決に役立つことを願っています。 ありがとうございます。あなたがあなたのケースでVector<Vector>
に基づいていますVector
が、JTable平野戻りしようとしたので
[SSCCE](http://sscce.org/)で質問を編集してください。 – mKorbel