1

プログラムに JTable があります。JButtonをクリックした後に更新したい。私はこれを書きました:

DefaultTableModel myTable = new DefaultTableModel(celDatas,celNames);
        JTable source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {
  return false;}};
        JScrollPane pane = new JScrollPane(source);

(...)
    start.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
                    query = "Select sal FROM EMP";
    myTable =(DefaultTableModel)source.getModel();
                myTable.fireTableDataChanged();
}

問題は、id が JTable のデータを更新しないことです。この問題を解決するにはどうすればよいですか?


編集: JTable は JScrollPane を介して私の男に表示されます。私は今これを作ります:

   source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
   pane = new JScrollPane(source);

データベースからデータを取得する新しいボイドも作成しました + そこで myTable を定義します。

void queryConnection() {
   (...)
        myTable = new DefaultTableModel(celDatas,celNames);

}

JTable を更新する JButton を追加しました (クエリを変更したとき)。

start.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e)
    {
          query = "Select sal FROM EMP";
          queryConnection();
    }
}

================================================== ==============================

public class Application2 implements Runnable {
private JTable source;
   private JScrollPane pane;
   private DefaultTableModel myTable;

   private JPanel panel;

   private String[][] celDatas = null;
   private String[] celNames = null;

   public void run() {


(...)


start.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
        {
            if(...) {

                query = "Select sal FROM EMP";
                queryConnection();
            }
}

if(query == null) {
            query = "Select * from EMP";
            queryConnection();
        }

        source = new JTable(myTable){public boolean isCellEditable(int rowIndex, int colIndex) {return false;}};
        pane = new JScrollPane(source);
        pane.setSize(f.getSize().width-60,300);
        pane.setLocation(30,20);

panel.add(pane);
f.add(panel);
        f.pack();
}
void queryConnection() {


//here is connection and downloading datas

myTable = new DefaultTableModel(celDatas,celNames);

}

今はもっと便利だといいのですが?;)

4

1 に答える 1

3

新しい TableModel を作成している場合はメソッドを呼び出す必要はありませんがfireXXX()、AbstractTableModel に基づいて TableModel を作成している場合は主にこれらを呼び出す必要があります (そうではありません)。

あなたの問題は他の場所にあると思います。新しい JTable を作成し、それを新しい JScrollPane に追加しているようです。これらのコンポーネントを GUI に追加していますか (表示されていません)。もしそうなら、あなたが追加しようとしているコンテナは、新しいコンポーネントをスムーズに受け入れることができますか? コンテナを再検証して再塗装しますか? 新しく作成した JTable は GUI に表示されていますか?

または、GUI にすでに JTable が表示されていますか? その場合、新しい JTable を作成するのではなく、そのモデルを設定するだけでよいでしょう。私はこの解決策を最も簡単だと思います。

編集1
私は次のようにします:

  • バックグラウンド スレッドでデータベースにアクセスし、そこから情報を取得します。
  • データベースから抽出されたデータで満たす新しい DefaultTableModel オブジェクトを作成します。
  • JTable が既に存在する場合は、新しい JTable を作成しません。代わりに、現在表示されている JTable を呼び出しsetTableModel(...)て、新しく作成した DefaultTableModel オブジェクトを渡すだけです。
  • それから私は座って、大金や成功の他の成果を楽しんでいました.

編集 2
ガンジラ、私たちがあなたを最大限に支援できるようにするには、問題をよりよく理解する必要があります。そのため、問題の完全な説明またはsscceを要求しましたが、どちらも見ていません。あなたの問題を理解することに関する私の問題は次のとおりです。

  • 繰り返しになりますが、既に GUI に表示されている JTable があり、データベースから抽出されたデータに基づいて JTable に表示されるデータを変更しようとしていますか?
  • もしそうなら、まったく新しい JTable を作成するのではなく、単に既存の JTable のモデルを変更してみませんか?
  • アプリケーションにまだ JTable がなく、それを表示したい場合は、データが表示されていないと述べますが、その理由を理解するのに役立つコードは示しません。
  • 最初の 2 つの質問に答えることができれば、sscce は必要ないかもしれませんが、そうでない場合は、現在の投稿がsscceに近いものではないことを理解してください。つまり、実行できず、コンパイルもできません。私たちのためにあなたの問題を再現してください....これらの条件がすべて重要である理由を説明しているので、リンクをまだ読んでいるかどうか疑問に思う必要があります(大量の無関係なコードで私たちを溺れさせないように簡潔に)。
  • いいえ、SSCCE を投稿する必要はありませんが、質問のテキストとコード スニペットに基づいてサポートできない場合は、問題を理解して解決策を見つけることができる可能性が高くなります。あなた。

編集3
あなたは次のように述べています:

JTable は「プログラムの開始」を示しているため、既に GUI に組み込まれています。JButton をクリックした後、JTable の値を変更したいと思います。既存の JTable のモデルは変更されません。何も変更されません。

そして、これは私がずっと提案してきた最善の解決策であるため、私を混乱させます.新しいJTableを作成するのではなく、新しいDefaultTableModelを作成し、既存のJTableのモデルを変更してください. これを試していない理由、または試したことがある場合、どのように機能しないかについてはまだ言及していません。

于 2012-04-15T14:42:25.413 に答える