如果我在 invokeLater 中创建了一个 class 的实例,那么在 EDT 上是否所有方法都在 class 运行 中?

If i create an instance of a class within invokeLater, are all methods within that class run on the EDT?

public static void main(String[] args){
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            Mainwindow frame = new MainWindow();
            frame.setVisible(true);
            }

public class MainWindow extends JFrame {

public MainWindow(){
 // methods to set title, bounds, JPanels, etc.
 }

public static void methodOne(){
// updates GUI
}

public static void methodTwo(){
// also updates GUI
}

问题 1:假设我打电话给

 MainWindow.methodOne 

来自 static main 内部,或来自另一个 class 在 static main 中实例化。

methodOne() 运行 来自 EDT 或初始线程?

问题二:参考上面的代码,在方法里面

@Override
public void run(){
}

最佳做法是使用:

MainWindow frame = new MainWindow();
frame.setVisibility(true);

或者简单地说:

new MainWindow();

并且有

setVisibility(true)

在 MainWindow 构造函数内部,考虑到 MainWindow 内部的所有方法都是静态的?

请把所有的答案都变哑,我对编码很陌生....

提前致谢

问题 1

方法中的代码将 运行 在调用它们的线程上运行,与您调用其方法的对象是在哪个线程上创建的无关。当您在特定线程上创建对象时,只有它的构造函数保证在该线程上 运行。

此外,在这种情况下,由于您有 static 方法,这些方法不属于 frame 实例,它们属于 MainWindow class .

问题二

你使用什么方法取决于你想做什么。 第一种方法给了你更多的控制权,使用它,你可以在某个时候创建​​一个新的 class 实例并稍后显示它。

第二种方法通常用于主框架,程序启动时显示的框架可以将该语句放在class'构造函数中。