目前我正在使用swing的Thread模型遇到一些重大问题。 AFAIK Swing定义了3种不同的线程:
示例:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// init gui here
}
});
}
这是一个简单的例子,其中main方法是初始Thread,程序启动时我们调用一个新的Thread(Event dispatch Thread)来启动GUI。
这是对的吗?
现在我的问题:
我正在编写一个Swing程序,它连接到两个不同的服务器,并在视觉上区分它们。因此,我有2x连接连接= ... “左”服务器的第一个连接对象存在于初始主线程中,因为该程序将在其中一个服务器的环境中执行=>连接对象由环境预定义并且存在并且是main()的开头。第二个连接对象将在程序中手动构建。
现在的问题是我使用invokeLater()将每一段GUI代码转移到Event dispatch Thread。因为我使用GUI让用户选择第二服务器的凭证,所以“正确”服务器的连接代码位于GUI内,因此位于事件调度线程中。但是我确实需要一个Thread中的两个连接对象,因为在某一点上我必须同时使用这两个对象。
示例:
public void run() {
// Left connection object is predefined and named "contect" here
// Right connection objects is created here using a GUI
connection = new ConnectionDialog().getConnection();
Project[] projects = connection.getProjects();
ProjectDialog pd = new ProjectDialog(Diff.this, projects);
otherProject = pd.getSelectedProject();
if (otherProject == null) {
return;
}
this.leftStore = (TemplateStoreRoot) context.requireSpecialist(StoreAgent.TYPE).getStore(Store.Type.TEMPLATESTORE);
this.rightStore = otherProject.getUserService().getTemplateStore();
this.leftSets = context.requireSpecialist(ProjectAgent.TYPE).getTemplateSets();
this.rightSets = otherProject.getUserService().getProject().getTemplateSets();
this.init();
this.setEnabled(true);
this.setVisible(true);
}
我该怎么办才能使这项工作成功?我是通过将每个GUI代码转移到事件派遣线程来做错的吗?文件说我必须这样做。
谢谢!
答案 0 :(得分:0)
您必须创建一个框架来保持您的用户界面吗?子类JFrame,添加自己的构造函数并将第一个连接对象作为参数传递。您可以将其保存在框架对象中并在其中使用。
也就是说,如果你希望你的UI能够做出响应,你不应该在UI线程中进行任何冗长的计算,等待网络数据等。