1

我正在嘗試建立網絡連接,並且詳細信息位於JFrame中。當用戶點擊一個按鈕時,它應該啓動新的線程,並應該向用戶顯示等待消息,直到主線程建立網絡連接。我寫了這個代碼未顯示框架的新線程

public void actionPerformed(ActionEvent arg0) { 
    Thread ref = new Thread(new Test());//Create a new thread 
    ref.start(); 
     new AIDRTConnManager().createConnection(ipAddress, portAddress);//main thread 
     } 



//This is my Thread Class 
    public class Test implements Runnable{ 
    JDialog waitDialog; 
    JPanel panel1 = new JPanel(); 
    JLabel waitLabel; 
    JFrame frame; 


    public void run(){ 
     frame = new JFrame(); 
     waitDialog = new JDialog(frame,AIRDT.toolName, true); 
     waitDialog.setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE); 
     JLabel waitLabel = new JLabel("Trying to Connect to PleaseWait...",ErrorDialog.icon,SwingConstants.CENTER); 
      panel1.add(waitLabel); 
      waitDialog.add(panel1); 
      waitDialog.setSize(100, 40); 
      waitDialog.setBounds(500,300, 300, 80); 
     waitDialog.setVisible(true); 
    } 
} 

但是,當我按一下按鈕,所有JDialog顯示空框,無需等待消息(JLable)有一次我與網絡連接完成後,此等待消息顯示正確。

我哪裏去錯了?這是一個Swing問題(或)線程問題?

您能不能幫我展示一個等待消息,直到完成後端活動?

+0

有趣的是,你調用'waitDialog.setSize(100,40); waitDialog.setBounds(500,300,300,80); ''setBounds'是一次調用setLocation()和setSize()的快捷方式。 – 2013-02-20 08:49:29

回答

3

你在這裏混淆你的線程 - 所有與UI交互的操作,比如創建一個新幀,都必須在事件發送線程(EDT)或主線程中發生。後臺任務應該在不同的線程上執行。

基本上你有它倒退 - 你應該在新線程中執行後臺工作,並在主線程中創建新框架,這與現在的方式是相反的。

+0

+1的確他把這一切都扭轉過來了。等待對話框應該在actionPerformed中啓動,而連接應該在新線程中完成。爲了澄清這一切,通常稱爲「主線程」的線程是在JVM的starup處調用main(String [] args)'方法的線程。它經常與EDT混合使用,因爲許多用戶在「主線程」中啓動UI,而實際上應該使用「SwingUtilities.invokeLater」在EDT中執行此操作。 – 2013-02-20 08:52:52

+0

@ajshort感謝您的詳細解釋。它部分解決了我的問題。我在新線程中完成了我的後臺工作,並創建了網絡連接。同時我設置了waitDialog.setVisible(true);在我的主線程中。但設置完成後,我的主線程根本不會恢復。 waitDialog.setVisible(true)發生了什麼;?它顯示等待對話框。但之後,沒有什麼作品。我添加了一個條件來檢查我的後臺工作是否完成。如果是這樣,我試圖隱藏Waitdialog.But這種情況本身沒有運行。 waitDialog.setVisible(true)凍結主線程.Pl幫助 – Karthik 2013-02-20 10:32:43

+0

您不應該添加條件,而應將創建的線程回調到主線程,以便在工作完成時通知它。有一個「SwingWorker」類,它專爲您正在嘗試做的事而設計。它會在後臺運行一個任務,然後在完成時在EDT上調用'done'方法。請參閱http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html以獲得非常好的概述。 – ajshort 2013-02-20 10:36:53

3

actionPerformed下的代碼在事件派發線程(EDT)下執行,而不是在主線程中執行,如您在註釋中所述。

這意味着只要發生​​連接事件,EDT就會被阻止,所以它不必處理其他UI內容,例如顯示您的JDialog

此外,與問題無關,但請注意,您將創建一個永不顯示的JFrame,這是您的JDialog的母公司。