主要方法invokeLater可以创建与Java主方法中通常不同的方法吗?

可以对invokeLater进行编码,以便您可以创建Runnable的实例,然后@Override方法run(),然后将该Runnable变量发送到方法中。

我想知道你是否可以改变代码的生成方式并仍然得到相同的结果,因为这就是我开始弄清楚事物在编程语言中如何工作的方式。

码:

import javax.swing.*; public class DDHSimpleProgram { JFrame f = new JFrame("A simple Swing Program"); JLabel l = new JLabel("Swing powers the modern GUI!"); public DDHSimpleProgram() { f.setLocation(300, 300); f.setSize(500, 500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(l); f.pack(); f.setVisible(true); } public void run() { new DDHSimpleProgram(); } public static void main(String[] args) { Runnable r = null; SwingUtilities.invokeLater(r); } } 

此代码有效:

下面的代码与实现Runnable接口的程序一起使用,然后在零参数构造函数中创建GUI。 invokeLater将对象的新实例创建为匿名类。 除了向控制台写入消息之外,Run方法实际上不会执行任何操作。 我仍然认为这是面向对象设计结构中一个有趣的部分,对我来说有时候仍然很奇怪,因为你可以实际拥有你希望它做的任何方法。

 import javax.swing.*; public class DDHSimpleProgram implements Runnable { JFrame f = new JFrame("A simple Swing Program"); JLabel l = new JLabel("Swing powers the modern GUI!"); public DDHSimpleProgram() { f.setLocation(300, 300); f.setSize(500, 500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(l); f.pack(); f.setVisible(true); } @Override public void run() { System.out.println("Run Method"); } public static void main(String[] args) { SwingUtilities.invokeLater(new DDHSimpleProgram()); } } 

不,你不能这样做。

这是因为您将Runnable设置为null,将其插入SwingUtilities,但所有SwingUtilities都知道为null。 这是因为Java对象是通过值(指针值)传递的,因此您无法在SwingUtilities中更改已设置为null的内容。

此代码也可能抛出NullPointerException。

第一个例子不起作用, rnull 。 它不会来的原因是因为你的类没有实现Runnable ,所以invokeLater永远不会调用run

第二个示例在EDT之外构造UI类,但调用通过invokeLater run EDT

我会构造一个implements RunnableMain类。 从它的main方法,我将构造一个Main实例并将其作为对invokeLater的引用传递。 在run方法中,我会去构建UI,但我这样挑剔

可以对invokeLater进行编码,以便您可以创建Runnable的实例,然后@Override方法run(),然后将该Runnable变量发送到方法中。

答案是肯定的。 实现Runnable任何对象实例都可以传递给invokeLater

更新了示例…

基于主界面的假设看起来像……

 public class DDHSimpleProgram { JFrame f = new JFrame("A simple Swing Program"); JLabel l = new JLabel("Swing powers the modern GUI!"); public DDHSimpleProgram() { f.setLocation(300, 300); f.setSize(500, 500); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.getContentPane().add(l); f.pack(); f.setVisible(true); } } 

我可能会使用Main类……

 public class Main implements Runnable { public static void main(String[] args) { EventQueue.invokeLater(new Main()); } @Override public void run() { DDHSimpleProgram prog = new DDHSimpleProgram(); } }