我读过几本关于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