java - 使用 Java Swing 时实现 Runnable
问题描述
现在学习了一点 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();
}
}
}
}
这两种方式有何不同?一种方式更可取吗?
解决方案
这两种方式有何不同?
他们不是,不是真的,他们基本上是以不同的方式实现同样的事情。
第一种是更“传统”的方法,而第二种是更“现代”或简写的方法,它利用了匿名类的优势,欢迎将匿名类引入语言。
还有更优选的选择吗?
这是一个见仁见智的问题,就我的钱而言,第二个是首选,因为它不会Runnable
在类上放置其他不必要的一致性,它还委派了在调用者上(正确)设置 UI 并停止代码的责任做出假设(即,您可以随时简单地构造框架并运行它......只需在事件调度线程的上下文中进行)。
此外,作为首选项,您不应该直接从 扩展JFrame
,因为您实际上并没有向该类添加新功能,而是如第二个示例中所做的那样,只需在需要时创建一个实例并在其上构建您的 UI最重要的是
您可能还想查看Swing 中的并发,以了解有关为什么应该使用EventQueue.invokeLater
来启动 UI的更多详细信息
推荐阅读
- redis - 哪个 Canoe 版本与链接中为 REDIS 客户端实现提供的 soln 兼容 https://github.com/ServiceStack/ServiceStack.Redis
- javascript - Gsap ScrollTrigger 动画水平
- python - 根据 onclick 表值预选下拉选项并导航到另一个页面
- vbscript - 如何使用 VB 脚本保存 Word 文档?
- sql - SQL Server 中“CREATE TABLE table AS”中的“分发选项”错误
- tinymce - Strapi 媒体库奇怪的行为
- javascript - JavaScript 查找并返回句子中最长的单词只有字母计数数字将被忽略
- python - 如何使用 Python 从 Outlook 约会创建 Skype 会议?
- grails - 聚焦或滚动到 gsp 页面的 gsp 模板中的特定 div
- javascript - SonarQube 问题需要一个赋值或函数调用,而不是看到一个表达式