2012-03-08 9 views
1

私は自分のjtableを作成するクラスを作成しました。私はそれを更新しようとすると動作しません(何も起こらない - 私はそれが間違っている更新しようとしている方法だと思うので)いくつかの問題があります。何が間違っているのですか?jtableの更新に関する問題点Java

class tableClass 
{ 
    public Vector rowData = null; 
    public Vector columnNames = null; 
    private JTable jTable; 
    DefaultTableModel model; 

    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput) 
    {  
     rowData = rowDataInput; 
     columnNames = columnNamesInput; 

     jTable = new JTable(rowData, columnNames); 
     jTable.setFillsViewportHeight(true); 

     JScrollPane jScrollPane = new JScrollPane(jTable); 
     jScrollPane.setPreferredSize(new Dimension(300, 100)); 
     jPanel.add(jScrollPane,BorderLayout.CENTER); 
    } 

    public void updateTable(Vector rowDataInput) 
    { 
     rowData = rowDataInput; 
     model =(DefaultTableModel)jTable.getModel(); 
     model.fireTableDataChanged(); 
    } 
} 
+0

あなたは 'updateTable'で何も変更していませんが、何も変更しないとどうなりますか? – stryba

+0

'rowData'には新しいコンテンツデータが含まれていますが、そのmodel.fireTableDataChanged();それをリフレッシュするはずですか? –

+0

'rowData'を' rowDataInput'に、 'JTable'はこれを知らず、古い' rowData'を指しています。私はここでポインタと混同していると信じています。一番下の行は、データが変更されたことをテーブルモデルに伝え、 'fireTableDataChanged'を呼び出すだけで、' JTable'などの添付ビューを通知します。 – stryba

答えて

1

がコンストラクタのJTableに与えられます。次にupdateTableTableClassrowDataフィールドを更新するだけです。したがって、JTableTableModelもあなたの変更について何も知りません。テーブルのモデルをupdateTableに更新する必要があります。

つまり、rowDataupdateTableに更新すると、コンストラクタのJTableに渡された同じrowDataオブジェクトは更新されません。

以下のクラスは、機能的にはクラスと同じです。これは、あなたがやっていることが効果がない理由をより明確にしていますか?ご覧のとおり、rowDataはTableClassとJTableで共有されることはありません。 TableModelを更新する必要があります。独自のTableModelを実装し、そのオブジェクトを変更内容で更新することができます。

class tableClass 
{ 
    public Vector columnNames = null; 
    private JTable jTable; 
    DefaultTableModel model; 

    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput) 
    {  
     Vector rowData = rowDataInput; 
     columnNames = columnNamesInput; 

     jTable = new JTable(rowData, columnNames); 
     jTable.setFillsViewportHeight(true); 

     JScrollPane jScrollPane = new JScrollPane(jTable); 
     jScrollPane.setPreferredSize(new Dimension(300, 100)); 
     jPanel.add(jScrollPane,BorderLayout.CENTER); 
    } 

    public void updateTable(Vector rowDataInput) 
    { 
     Vector rowData = rowDataInput; 
     model =(DefaultTableModel)jTable.getModel(); 
     model.fireTableDataChanged(); 
    } 
} 

変更が有効であることを証明するために、コードを次のように変更することができます。 注:私はではないこのアプローチを提唱 - 実際には独自のTableModelを実装する必要がありますが、単純に基になるモデル自体を変更する方法を示して、変更がJTableの画面上で起こるのを見てください。

EDITこの答えが受け入れられたとして、私はupdateTableに全データのベクトルまたはベクトルを更新する方法を示すために、以下のコードを更新しました@kleopatraからのコメントを以下とアダムの回答(1)@使用。私はまだ生産コードでこれをやっていないだろうが、少なくともこれは機能的に正しいものでOPの質問に近い。

class MyTable { 
    private Vector columnNames = null; 
    private JTable jTable; 

    public tableClass(JPanel jPanel, Vector rowDataInput, Vector columnNamesInput) { 
     // ... 
     jTable = new JTable(rowData, columnNames); 
     // ... 
    } 

    public void updateTable(Vector rowDataInput) { 
     model =(DefaultTableModel)jTable.getModel(); 

     // Now actually update the model with your new data: 
     model.setDataVector(rowDataInput, columnNames); 
    } 
} 

私が言ったように、これはそれを行うには良い方法ではありませんが、私はちょうどあなたがやっていることは働いていない理由をお見せしようとしています。あなたが書いた:)

+0

私はまた、 'モデル=(DefaultTableModel)jTable.getModel(); model.fireTableDataChanged(); 'または私は何かが不足していますか? –

+0

はい - コンストラクタ内のJTableに渡したrowDataは決して変更されません...単にrowDataへの参照であり、rowData自体やJTableが知っているものではありません。 – alpian

+0

私に例を教えてもらえますか?多くの方に感謝します。 –

0

rowData = rowDataInput; 

それはあなたがコンストラクタでのJTableに渡されたrowDataは変更されません。

2

あなたの正しい方向を指し示すために、ここではあなたのクラスのややクリーンな作業バージョンがあります。多くのデータがある場合は、このようなテーブルを更新することが効率的でないことにご注意ください!あなたは自分自身でAbstractTableModelをサブクラス化し、すでに持っているデータ構造にマッピングするほうが良いでしょう。

public class Table { 
    public Vector<String> columnNames; 
    private JTable table; 

    public Table(JPanel panel, Vector<Vector<Object>> rowData, 
      Vector<String> columnNames) { 
     this.columnNames = columnNames; 

     table = new JTable(rowData, columnNames); 
     table.setFillsViewportHeight(true); 

     JScrollPane scrollPane = new JScrollPane(table); 
     scrollPane.setPreferredSize(new Dimension(300, 100)); 
     panel.add(scrollPane, BorderLayout.CENTER); 
    } 

    public void updateTable(Vector<Vector<Object>> rowData) { 
     DefaultTableModel model = (DefaultTableModel) table.getModel(); 
     model.setDataVector(rowData, columnNames); 
    } 
+0

外部から何も起動する必要はなく、DefaultTableModelは正常に動作します:-) – kleopatra

+0

@kleopatra良い点。今編集されて、ほとんど何も残っていない! – Adam

+0

@Adam私は、あなたの(より完全でより完全な)例を含めて答えを更新しました。私もあなたの答えをupvoted。 – alpian

関連する問題