我讀過幾本關於Java的書。在他們所有人中至少有一章講授GUI編程。在所有這些,創建一個簡單的表格申請按照這樣的邏輯:應該從Event Dispatcher或主線程控制Swing GUI應用程序嗎?
MyFrame.java
public class MyFrame extends JFrame
{
JButton button1;
public MyFrame()
{
button1 = new JButton("Click here.");
}
}
FrameTest.java:
public class FrameTest
{
public static void main(String[] args)
{
MyFrame myFrame = new MyFrame();
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setSize(600, 600);
myFrame.setVisible(true);
}
}
基本上,只要子類JFrame的創建形式和將其他組件聲明爲實例變量並在構造函數中初始化這些組件。然後創建另一個測試類,在該類中實例化框架子類並調用其某些方法以使其可見。
但是在併發課程中,我瞭解到我們有一個主線程,它在我們創建的每個應用程序中運行main()。據我所知,當我們使用Swing來創建GUI應用程序時,我們有另一個線程(Event Dispatcher Thread)。所以如果我沒有弄錯,在每個基於Swing的GUI應用程序中至少有兩個線程。這使得每個GUI應用程序都是多線程的。在我讀過的一些文章和教程中,它指出Swing不支持多線程,因此所有GUI組件都應該僅在Event Dispatcher Thread中創建和修改,否則可能會出現線程干擾和內存不一致錯誤。
即使在維基百科(http://en.wikipedia.org/wiki/Swing_%28Java%29)的最簡單示例中,它也是通過invokeLater方法制作的。
那麼哪一個纔是真正的方法?我錯在哪裏?
無論是否擴展'JFrame',關鍵是要在'EDT'上執行GUI任務。所有耗時或阻塞的活動(如網絡I/O)都應該在單獨的線程中運行(例如,通過'SwingWorker'委託)以避免GUI凍結。 – asgs 2013-03-13 20:17:20