我一直在問最近一個項目的許多問題。這裏是我所處的場景,任何幫助或正確的方向將有助於很多...EDT與主線程之間的通信
這是一個使用服務器和多個客戶端構建的網絡程序。每個客戶端都有一個GUI,它必須根據服務器發送的命令行事。每個客戶都被包裝在名爲Player
的類中。這個Player
有一個GUI(擴展JFrame
)和一個主要方法,並且服務器只有一個主要方法(沒有GUI)。起初,這個類在主線程中創建這樣的:
EventQueue.invokeLater(new Runnable()
{
public void run()
{
new Player().setVisible(true);
}
});
這是工作的罰款,直到我意識到整個Player
類在EDT現在正執行。因此,當我等待來自服務器的命令時,整個GUI將鎖定,直到發送該命令並執行適當的操作。正如你可以想象的那樣,這是一個可怕的設計,並且被證明是編碼環境的一個真正的痛苦,當你每次想要檢查某些東西時都必須找到一些瘋狂的工作,這樣GUI才能保持完好無損。
很顯然,我必須在單獨的線程中檢查來自服務器的命令,並在EDT中運行GUI組件。我的第二個實現有兩個類 - 一個用於GUI,另一個用於Player
。當時的想法是,該Player
有這樣舉行的GUI,這樣我可以從Player
類訪問GUI的變量,像這樣:
class Player
{
public GUI gui;
...
// And then start this gui inside of the EDT.
EventQueue.invokeLater(new Runnable()
{
public void run()
{
this.gui = new GUI().setVisible(true);
}
}
這也不管用,新Runnable
this
因爲裏面對象是指Runnable
對象,而不是Player
。
如何在一個線程中的Player
類與EDT線程中相應的GUI類之間進行通信?