4

ローカル MySQL サーバーから情報を取得するテーブルがあります。データを非常によく読み取り、GUI に投稿します。

私の質問は、テーブルコマンドを変更したときにテーブルを更新するにはどうすればよいですか、例えば:

private String sql = "select * from profildb.tbl_detailed";  //to
private String sql = "select * from profildb.tbl_detailed where Y.."; //this

このアクションは Button Action Listener で処理されます。

    JButton btnOK = new JButton("");
    btnOK.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {

            if( (tfBirinci.getText().isEmpty() || tfBirinci.getText() == null) && (tfIkinci.getText().isEmpty() || tfIkinci.getText() == null ))
            {
                taLog.setText("Database alani bos birakilamaz...\n");
            }
            else if ( (!(tfBirinci.getText().isEmpty() )) && (tfIkinci.getText().isEmpty() || tfIkinci.getText() == null ) )
            {
                sql = ("SELECT * FROM " + tfBirinci.getText());
                taLog.setText("Komut elde edildi : " + sql + "\n");
                System.out.println("aaaa " + tfBirinci.getText());
                //anaFrame.dispose();
                //databaseHistoryCalistir(); doesnt work
            }
            else if ( ( !(tfBirinci.getText().isEmpty() ) &&  !(tfBirinci.getText() == null) )  && ( !(tfIkinci.getText().isEmpty() ) && !(tfBirinci.getText() == null) ) )
            {
                sql = ("SELECT * FROM " + tfBirinci.getText() + " WHERE " + tfIkinci.getText());
                taLog.setText("Komut elde edildi : " + sql + "\n" );
                System.out.println("bbbb " + tfBirinci.getText());
                //anaFrame.dispose();
                //databaseHistoryCalistir(); doesnt work
            }else 
                taLog.setText("Lütfen Database alanini doldurunuz, aksi taktirde komut elde edilemez...\n");
        }
    });

では、文字列のステートメントを変更したときにのみテーブルを更新するために実装する必要があるのは何ですか?

前もって感謝します。(DefaultTableModel に関する例を挙げれば素晴らしいでしょう)

編集、ここで私の完全なコードを見ることができます:http://pastebin.com/eQCJVuKn

4

1 に答える 1

3

1) @camickr のデータベースからテーブルを使用

2) のいずれかを使用ResultsetTableModel

3) から SQL ステートメントを呼び出しますRunnable#Threadが、への出力はXxxTableModel内部にある必要がありますinvokeLater。さらに、Swing の ConcurencyについてEvent Dispatch Thread (EDT)

4) SwingWorkerから SQL ステートメントを呼び出し、次に から出力するかprogress()publish()またはdone()EDT 上にある必要があります

5)DefaultTableModelオーバーライド メソッドは必要ありませんfireXxxTableXxx。それらはすべて正しく実装されています。

6) ロジックTable from Database (ResultsetTableModel)Runnable#Thread(SwingWorker)isの違い

  • Table from Database (ResultsetTableModel)EDT ですべての更新を呼び出し、すべてのイベントを待機している GUI が完了し、データベースからデータをロードしている間、GUI は責任を負わないかフリーズします

  • Runnable#Thread(SwingWorker)すべての更新はバックゴーン タスクからのものであり、GUI はマウスとキーボードのイベントに責任があります。

于 2012-07-08T11:05:49.553 に答える