gpt4 book ai didi

java - 使用 Java Swing 时实现 Runnable

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:06:28 25 4
gpt4 key购买 nike

现在学习了一点 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com