she*_*jia 5 java swing event-dispatch-thread 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());
}
}
Run Code Online (Sandbox Code Playgroud)
第二个教程没有实现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();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这两种方式有何不同?有一种方法更可取吗?
这两种方式有何不同?
他们没有,不是真的,他们基本上是以不同的方式实现同样的事情。
第一种是更“传统”的方法,而第二种是更“现代”或人手不足的方法,它利用了受欢迎的将匿名类引入到语言中的优势。
还有更可取的选择吗?
这是一个意见问题,对于我来说,第二个是首选,因为它不会在类上添加不必要的一致性Runnable
,它还委托调用者负责(正确)设置 UI 并停止代码做出假设(即您可以随时简单地构建框架并运行它......只需在事件调度线程的上下文中执行即可)。
另外,作为首选,您不应该直接从 扩展JFrame
,因为您实际上并没有向类添加新功能,而是像第二个示例中所做的那样,只需在需要时创建一个实例并在其上构建您的 UI在它的顶部
您可能还想查看Swing 中的并发,以了解有关为什么应该使用EventQueue.invokeLater
它来启动 UI 的更多详细信息
归档时间: |
|
查看次数: |
2468 次 |
最近记录: |