我正在開發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);
}
});
那麼如何將數據從事件調度線程傳遞給「初始化者」對象,然後如何將數據從初始者傳遞迴事件派發?
非常感謝您的好評。談話確實無效。問題是我沒有在調度線程上創建它。解決方案的作用是用我們創建的'ed'對象替換爲空白對象並創建'對話',例如。 run()中的initComponents()而不是ed.initComponents() – Imme22009 2009-08-25 19:12:35