2009-08-18 70 views
1

我正在開發Swing/Java應用程序,但難以將initiliaser線程中的數據傳遞到其中一個GUI。將數據從GUI傳遞到Swing中的事件派發線程

該GUI是通過在其run()方法事件調度線程上調用initComponents()方法初始化:

javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 

      ChatSession ed = new ChatSession(client); 

      ed.initComponents(); 

      ed.setVisible(true); 

     } 
    }); 

在ChatSession.java,我有一個方法initComponents()其中包含行:

conversation = new javax.swing.JTextArea(); 

然後我需要從正在偵聽TCP數據包的ChatSession.java對象中的另一個方法更新GUI。我需要將通過TCP套接字進入的新文本附加到GUI上的「對話」JTextArea。

我該怎麼做?我曾嘗試使用invokeLater在事件派發線程上運行一個方法,但我得到一個NullPointerException錯誤...?

java.awt.EventQueue.invokeLater(
    new Runnable() { 
     public void run() 
     { 
      //conversation.append(text); 
      ChatSession.this.conversation.append("text to append to chatbox"); 
     } 
    }); 

我也嘗試了註釋掉的行,仍然得到一個NPE。

我還需要通過單擊按鈕(爲了通過網絡將其發送到另一個客戶端)將事件調度線程中的數據傳遞到ChatSession對象。

我有被分配給使用初始化事件分配線程上的ActionListener按鈕的響應點擊在ChatSession.java的方法:

在ChatSession.java的方法:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) 
{           
    // add to toSend buffer 
    toSend.append(sendtext.getText()); 
} 

....被分配到一個ActionListener中的initComponents(),ChatSession.java的一部分,(這是事件調度線程上運行,見前面):

jButton1.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      jButton1ActionPerformed(evt); 
     } 
    }); 

那麼如何將數據從事件調度線程傳遞給「初始化者」對象,然後如何將數據從初始者傳遞迴事件派發?

回答

1

你已經有了正確的方法來使用SwingUtilities.invokeLater()將數據推送到事件分派線程。 NPE表明你有其他錯誤。

鑑於這行:

conversation.append(text) 

是生產NPE,有三種選擇:

  • 談話空。你是否在ChatSession的構造函數中初始化對話?
  • ChatSession中的其他內容在append()中調用的內容爲空
  • 傳入的文本爲空,並且append()不能正確處理該內容。

您應該能夠查看異常的堆棧跟蹤以確定它是否是第一個問題(.append()行將是跟蹤中的最後一行)。如果是這種情況,請確保您新增了對話。對於另外兩個,請查看堆棧跟蹤中的第一行,看看那裏有什麼。

有幾種可能的方式將數據從EDT上轉移到後臺線程上;你想要哪種方法取決於「初始化者」對象的許多方面。

+0

非常感謝您的好評。談話確實無效。問題是我沒有在調度線程上創建它。解決方案的作用是用我們創建的'ed'對象替換爲空白對象並創建'對話',例如。 run()中的initComponents()而不是ed.initComponents() – Imme22009 2009-08-25 19:12:35

0

我不完全清楚你的所有問題,但我認爲你可能會奇怪地構建你的程序併爲自己創造問題。你的ChatSession類應該改變它自己的文本。如果您的主程序需要捕獲數據包(而不是ChatSession),則應該爲ChatSession上的文本字段設置setter。

查看this關於Swing的MVC版本的文章。

+0

感謝您對吸氣和吸氣者的建議。我已經重組了我的代碼來使用它。並在結構上提示。非常有幫助 – Imme22009 2009-08-25 19:13:26

相關問題