2011-08-01 23 views
1

私はDefaultTableModelを使用してJTableを持つGUIを持っています。DefaultTableModel getValueAtメソッドは一見ランダムな結果を生成します

これらのインスタンス変数が宣言されている:

boolean doRun = false; 
Class clazz; 
Object obyect; 
DefaultTableModel model; 
ArrayList<String> al = new ArrayList(); 

テーブルは、このことによって移入され:

public StatusGUI(Object invokerObject) { 
    initComponents(); 
    setLocationRelativeTo(null); 
    clazz = invokerObject.getClass(); 
    obyect = invokerObject; 
    String line; 
    try { 
     Field[] fields = clazz.getDeclaredFields(); 
     for (int i = 0; i < fields.length; i++) { 
      if (!fields[i].isAccessible()) { 
       fields[i].setAccessible(true); 
      } 
      if (("" + fields[i].getType()).equals("class java.lang.String")) { 
       line = "String"; 
      } else { 
       line = "" + fields[i].getType(); 
      } 

      //Note: The first string in the Object is the description, which is left empty 

      model.insertRow(0, new Object[]{"", fields[i].getName(), line, "" + fields[i]}); 
     } 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
    setVisible(true); 
} 

これは、(この場合)、変数に関する情報を含む5行を生成します。

私は次のコードで、ボタンを押して上のこれらの変数の情報を受信して​​格納したい:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {           
    for (int i = 0; i < model.getRowCount(); i++) { 
     String description = "" + model.getValueAt(i, 0); 
     System.out.println("Description " + i + ": " + description); 
     String name = "" + model.getValueAt(i, 3); 
     if (!description.equals("") && description != null) { 
      al.add(description + "::" + name); 
     } 
    } 
    if (al.isEmpty()) { 
     JOptionPane.showMessageDialog(this, "No descriptions were added to any of the variables." 
       + "\nThis could also be because no variables were found - if so, please see 'Help'"); 
    } else { 
     new Thread(new SendThread(al, obyect)).start(); 
     this.dispose(); 
    } 
}           

5行のすべてに説明を追加する場合は、上記のコードは次のような出力を生成します。

Description 0: d1 
Description 1: d2 
Description 2: d3 
Description 3: d4 
Description 4: 

場合のみ JTableの最初の行の記述を追加して、上記のコードは生成:

Description 0: 
Description 1: 
Description 2: 
Description 3: 
Description 4: 

これは5行すべてを認識していることを示していますが、何らかの理由で行から読み取ったときに正しく表示されません。

私は1時間ほど同じコード行を見てきましたが、間違っていることは正直には分かりません。

ありがとうございます。 マイク。

答えて

3

私のクリスタルボールはあなたのテーブルが編集中であると言います(最初の行の5行目、2行目の行0)。実行されたアクションの最初の編集をコミットします。

if (table.isEditing()) { 
    table.getCellEditor().stopCellEditing(); 
} 
+1

バッテリーが含まれていません+1 – mKorbel

+0

ありがとうございました:) しかし、なぜ私はコンストラクタでこれを行うことができないようですか?私は単純にstopCellEditing()を実行するとnullpointerを取得するようです。ステートメント –

+0

次に、まだテーブルを作成していないか、isEditing()チェックを行っていないかのいずれかです。しかし、コンストラクタの中で編集を止めることは意味がありません。なぜなら、その時点でテーブルはまだ画面に表示されていないからです。 –

3

しかし、なぜ私は、コンストラクタでこれを行うことができるように思えませんか?

これを行うために、テーブルにプロパティを設定できます。 Table Stop Editingを参照してください。

関連する問題