2013-02-12 240 views
1

我編寫了一個程序,顯示一個JFrame包含有關運行它的機器的信息(HOSTIP),它使JDBC連接顯示另一個信息。JFrame延遲顯示

我只在我main功能這兩行:

NewFrame nf = new NewFrame(); //Here I make all the needed calculations 
nf.setVisible(true); 

newFrame的擴展JFrame的

在我執行所有所需的計算構造並設置他們在nf JFrame顯示。

當我運行程序時,我看到了JFrame邊境0.5-1秒之前得到它充滿了信息,但我將它設置爲只構造之後是可見的。

這是我看到約秒:(內部爲我的桌面背景)

before

,然後我看到的信息:

after

爲什麼雖然我在構造函數中進行了所有計算,但發生這種情況?

+2

在這裏發佈您的代碼。很明顯,那裏有錯。 – StanislavL 2013-02-12 09:49:04

+0

這是大約500行的代碼..是否有任何特定的部分,當分配數據到'JFrame',可能會導致這個問題? – Maroun 2013-02-12 09:51:01

回答

1

裏面只有互動看起來像你在GUI線程中同步執行一些阻塞調用,即數據庫查詢。你應該這樣做異步使用SwingWorker

final JTextField field = new JTextField(); 
field.setEditable (false); 

JButton button = new JButton(new AbstractAction ("Calculate!") { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     field.setText ("Calculating..."); 

     new SwingWorker<String, String>() 
     { 
      @Override 
      protected String doInBackground() throws Exception { 
       Thread.sleep(3000L); 

       field.setText ("Calculated!"); 

       return null; 
      } 
     }.execute(); 
    } 
}); 

JFrame frame = new JFrame(); 
frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE); 
frame.getContentPane().setLayout (new BorderLayout()); 
frame.getContentPane().add (button, BorderLayout.NORTH); 
frame.getContentPane().add (field, BorderLayout.CENTER); 
frame.pack(); 
frame.setVisible (true); 
+3

-1用於訪問doInBackground中的字段(又名:關閉EDT) – kleopatra 2013-02-12 10:32:08

+0

@kleopatra方法'setText'是線程安全的。 – 2013-02-12 10:41:46

+0

不,它從來沒有,儘管在早期版本中記錄了_incorrectly_(閱讀:它是一個文檔錯誤!) – kleopatra 2013-02-12 10:47:32

5

聽起來你阻止事件分派線程(EDT)

您應該避免運行可能會阻止或耗時的EDT任何操作。這將阻止EDT發送重繪事件,這是重要的。

你可能想看看Concurrency in Swing大概Swing Worker

與Swing和線程處理時,其中一個重要的規則,你必須用Swing組件從EDT