2012-01-20 13 views
0

こんにちは、接続の試行が始まる前に「接続しています...」と言うテキストをラベルに表示しようとしています。以下のコードを実行すると、すべてが完了したらsettextが表示されます。接続の試行前に最初のsettextを表示するにはどうすればよいですか?Javaスイングjlabel.settextは即時ではありません

private void buttonConnectActionPerformed(java.awt.event.ActionEvent evt) { 
    try { 
     String url = "jdbc:mysql://domain.com:3306/tablename"; 
     String user = "username"; 
     String password = "userpassword"; 

     jLabel.setText("Connecting ..."); 

     con = DriverManager.getConnection(url, user, password); 

     jLabel.setText(con.getCatalog()); 

    } catch (SQLException ex) { 
     Logger.getLogger(connection.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 
+0

スレッドを作成しようとしましたか? – bmoran

答えて

0

問題は、基本的にあなたが持っているすべてのGUI項目を担当するスレッドであるあなたのEventDispatcherThreadでデータベースに接続しようとしているということです。スレッドはデータベースに接続する時間です。完了すると(つまり、データベースに接続すると)、GUIが更新されます。

あなたはそれを動作させるために、このようなものを使用することができます。

private void buttonConnectActionPerformed(java.awt.event.ActionEvent evt) { 
     jLabel.setText("Connecting ..."); 

     new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       try { 
         String url = "jdbc:mysql://domain.com:3306/tablename"; 
         String user = "username"; 
         String password = "userpassword"; 



         con = DriverManager.getConnection(url, user, password);   

        } catch (SQLException ex) { 
         Logger.getLogger(connection.class.getName()).log(Level.SEVERE, null, ex); 
} 
      } 
     } 
     )).start()   
} 

私はconは、いくつかのグローバル変数であると仮定しています。この場合、run()メソッド内でアクセスできるようにするには、finalと宣言する必要があります。

+0

'jLabel.setText(con.getCatalog());'は、あなたの例では間違った場所にあります。それは、接続が行われた後、EDTで行われなければならない。 – Jesper

+0

ありがとう@npinti、これはうまくいきましたが、最後に.start()を削除しました。 –

+0

-1、invokeLater()メソッドは、EDTにコードを追加するために使用されます。コードがEDT上で実行されている場合、GUIは再描画できません。したがって、EDTでデータベースへのアクセスを行うと、GUIが応答しなくなります。代わりに、データベースへのアクセスは別のスレッドで行う必要があります。より詳細な説明は、[Concurrency](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/index.html)のSwingチュートリアルのセクションを参照してください。 – camickr

関連する問題