Java 是否应该由EDT(事件调度线程)执行代码?

Java 是否应该由EDT(事件调度线程)执行代码?,java,user-interface,swing,refactoring,Java,User Interface,Swing,Refactoring,我开发了一个Swing GUI,其中包含12个JPanels。最初,所有的JPanels代码都写在主JFrame类代码中。结果,代码变得太长(10000多行) 现在我想重构代码,将代码分成13个类(一个JPanel各12个类,主JFrame各1个类),而不是一个包含所有代码的类 但我有一些困惑,如下所示: 最初,这12张JPanels被设置在一张“卡片”JPanel上,“卡片”JPanel的布局被设置为CardLayout,因此,根据点击的按钮,这12张JPanel中只有1张。现在,当我将这12

我开发了一个Swing GUI,其中包含12个
JPanel
s。最初,所有的
JPanel
s代码都写在主
JFrame
类代码中。结果,代码变得太长(10000多行)

现在我想重构代码,将代码分成13个类(一个
JPanel
各12个类,主
JFrame
各1个类),而不是一个包含所有代码的类

但我有一些困惑,如下所示:

  • 最初,这12张
    JPanel
    s被设置在一张“卡片”
    JPanel
    上,“卡片”
    JPanel
    的布局被设置为
    CardLayout
    ,因此,根据点击的按钮,这12张
    JPanel
    中只有1张
    。现在,当我将这12个
    JPanel
    s从
    MainJForm
    中分离出来,并将它们实现到自己的类中时,我认为每当用户单击按钮时,我需要首先实例化相应的
    JPanel
    。因此,在EDT(事件Dispath线程)上执行这项繁重的任务是否更好。如果否,那么在
    SwingWorker
    线程中创建一个JPanel实例并将引用传递给EDT是否有效

  • 您可以完全按照在一个类中安装面板时的方式来安装面板。因此,如果前面的实现在框架实例化时创建了所有对象,那么您可以同样实例化12个面板对象。如果在单击按钮时面板显示时已完成此操作,请以相同的方式执行

    在这种情况下,代码所在的问题在执行时应该不会对问题产生影响,至少在之前没有问题的情况下是如此(当点击按钮切换面板时,ui会挂起)


    当然,您可以先创建最初显示的面板,然后使用swingworker创建其他面板,以便第一个面板立即显示,其他面板在单击按钮后立即可用,而无需先实例化它们。只需确保在EDT中小心地调用更改当前显示的ui(如向框架中添加实例化面板)的调用。

    在EDT中构建
    JPanel
    的12个实例不应引起关注。我会继续这样做。这将使您的代码更易于阅读。警惕过早的优化。只有在遇到性能问题时,我才会优化性能。

    当前推荐的做法是,对swing组件的所有调用都在EDT上完成。见和


    如果(作为其初始化的一部分)这些面板中的任何一个需要一些可能需要很长时间的东西(如光盘或网络访问),那么这些调用应该委派给另一个线程,而不是对swing组件本身的任何更改。

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