是否应该由EDT(事件调度线程)执行代码之间的混淆?

时间:2010-01-23 12:06:54

标签: java user-interface swing refactoring

我开发了一个包含12个JPanel的Swing GUI。最初,所有JPanel代码都是在主JFrame类代码中编写的。结果,代码变得太长(超过10,000行)。

现在我想重构代码,将代码分成13个类(一个JPanel各12个类,主JFrame一个类)而不是1个承载所有代码的类。< / p>

但我有一些困惑如下:

  1. 最初,这12个JPanel被设置在“卡片”JPanel上,“卡片”JPanel的布局设置为CardLayout,因此只有1 JPanel根据用户点击的按钮,一次显示的JPanel中有{1}}个{1}}。现在当我从JPanel中分离出那些12 MainJForm并将它们中的每一个实现到它自己的类中时,我认为每当用户点击它时我需要首先实例化相应的JPanel按钮。那么,在EDT(Event Dispath Thread)上完成这项繁重任务会更好吗。如果不是,那么它是否可以在SwingWorker线程中创建JPanel的实例并传递ref。到EDT?

4 个答案:

答案 0 :(得分:1)

您可以完全按照与在一个班级中完成时相同的方式对您的面板进行实例化。因此,如果先前的实现在框架实例化中创建了所有对象,则可以同样实例化12个面板对象。如果按钮单击时面板显示完成,请按照相同的方式执行此操作。

代码的放置问题在这种情况下执行时应该对问题没有影响,至少只要之前没有问题(ui在按钮点击时切换面板时挂起)。

当然,您可以先创建最初显示的面板,然后使用swingworker创建其他面板,这样第一个就会立即显示,而其他一个在点击按钮后立即可用,而不必实例化它们第一。只需确保你注意在EDT中调用改变当前显示的ui的调用(比如在帧中添加实例化的面板)。

答案 1 :(得分:0)

在EDT中构建JPanel的12个实例不应该是一个问题。我会继续这样做。这将使您的代码更容易阅读。警惕过早优化。如果遇到性能问题,我只会优化性能。

答案 2 :(得分:0)

目前推荐的做法是,所有对挥杆组件的调用都是在EDT上完成的。请参阅 Java: Swing Libraries & Thread Safety Is it safe to construct Swing/AWT widgets NOT on the Event Dispatch Thread?

如果(作为其初始化的一部分)任何这些面板需要可能需要很长时间的某些内容(例如光盘或网络访问),那么这些调用应该委托给另一个线程,但不能将任何变更委托给组件本身。

答案 3 :(得分:0)

您可以查看任何SwingSet演示,例如SwingSet2SwingSet3