java - 使用 Java Swing 时实现 Runnable

标签 java swing runnable event-dispatch-thread

现在学习了一点 Swing,发现了两个使用不同方法制作简单 JFrame 窗口的教程。

第一个实现了 Runnable 并在类中有一个 JFrame 对象变量:

class SwingDemo implements Runnable {
    private JFrame frame;

    @Override
    public void run() {
        frame = new JFrame("title");

        ... // setSize(), add components, etc

    }
}

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new SwingDemo());
    }
}

第二个教程没有实现Runnable,而是使用类构造函数初始化JFrame,并通过匿名内部类调用构造函数

class SwingDemoAlt {

    public SwingDemoAlt() {
        JFrame frame = new JFrame("title");

        ... // again some code here

    }
}

public class Main {
    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new SwingDemoAlt();
            }
        }
    }
}

这两种方式有何不同?一种方法更可取吗?

最佳答案

How do the two ways differ?

他们不是,不是真的,他们基本上是在以不同的方式实现同​​一件事。

第一种是更“传统”的方法,而第二种是更“现代”或简化的方法,它利用了欢迎介绍Anonymous Classes。进入语言。

And is there a more preferred choice?

这是一个意见问题,为了我的钱,第二个是首选,因为它没有在类上放置不必要的 Runnable 一致性,它还委托(delegate)了设置 UI 的责任(正确地)在调用者上并阻止代码做出假设(即您可以随时简单地构建框架并运行它......只需在事件调度线程的上下文中执行即可)。

此外,作为一种偏好,您不应直接从 JFrame 扩展,因为您实际上并没有向该类添加新功能,相反,就像在第二个示例中所做的那样,只需创建当您需要它时创建一个实例并在其之上构建您的 UI

您可能还想看看 Concurrency in Swing有关为什么应该使用 EventQueue.invokeLater 启动 UI 的更多详细信息

关于java - 使用 Java Swing 时实现 Runnable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54247309/

相关文章:

java - 如何从android中的另一个项目和包导入.java

java - Java 8 上的 JBoss EAP 6.x

java - 使用线程和 Swing 显示更新延迟

java - Java 中的多线程。倒计时和计时器同时进行

java - 如何在 freemarker 中渲染原始 html?

java - 集群模式下的 Redis Pfcount

java - 调整 GridLayout 区域的大小

java - BoxLayout 无法共享。尝试将数组中的多个标签添加到 BoxLayout 面板中

java - 如何使用 CyclingBarrier 同步线程并保留其执行顺序?

java - Java中如何销毁线程