2012-04-07 10 views
1

私は単純なJFrameJTableをフレームに持っています。 ユーザーは、テーブルの行にデータを入力できます。要件の1つは、フレームを閉じた後に新しいデータを保存または破棄できることです。フレームのDefaultTableModelのdataVectorのクローニングに関する問題

  1. オーバーライドsetVisible()方法とDefaultTableModelのデータベクトルのクローンを作成:私は、この動作を実現する最も簡単な方法は、次のようであると考えました。

  2. フレームに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例外がスローされますが、この結末である:

その場合 ​​

、の最初の列最初の行が完全にレンダリングされる

私のCustomTableModelDefaultTableModelから拡張されており、特別な方法は使用していません。コンストラクタは、単にデータベクトルとヘッダベクトルをスーパークラスに渡します。

誰かが問題の解決に役立つことを願っています。 ありがとうございます。あなたがあなたのケースでVector<Vector>に基づいていますVectorが、JTable平野戻りしようとしたので

+2

[SSCCE](http://sscce.org/)で質問を編集してください。 – mKorbel

答えて

1

私は、あなたがVector clonedに誤りがあることを考えるheaderNamesベクトルの長さは、あなたがきた列数と一致する必要があり

1

得た。 VectorがCustomTableModelクラス内のヘッダー名の配列に変換されるため、混乱します。そのため、AIOOBEとして表示されます。

最初のパスでは、最初の列(インデックス0の列)のheaderNamesベクトル/配列を検索し、エラーの0> = 0バージョンを送信して失敗します。列名文字列を追加すると(最初の列全体がレンダリングされます)、次に2番目の列(インデックス1の列)が検索されます。 headerNamesベクトルに2番目の要素がなく、エラーの1> = 1バージョンが返されるので失敗します。

headerNamesベクトルに正しい数の値(データベクトルの列数に一致)があることを確認してください。

注 - clone()メソッドはデータのSHALLOWコピーを作成しているため、ユーザーがセル内のデータを変更すると元のオブジェクトは変更されます。この記事はそれを助けるかもしれません:http://javatechniques.com/blog/faster-deep-copies-of-java-objects/

1

AbstractTableModelの実装では、データ構造を直接制御できます。このexampleMap<String, String>を示していますが、選択は任意です。

関連する問題