我如何 运行 一个 GUI 文件作为 Java 中另一个 class 的线程?

How do I run a GUI file as a thread from another class in Java?

使用 window 生成器时的默认 GUI 代码如下。

import java.awt.EventQueue;
import javax.swing.JFrame;

public class Goo {

private JFrame frame;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                Goo window = new Goo();
                window.frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the application.
 */
public Goo() {
    initialize();
}

/**
 * Initialize the contents of the frame.
 */
private void initialize() {
    frame = new JFrame();
    frame.setBounds(100, 100, 450, 300);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}

我想 运行 来自另一个 class 的这个作为一个线程。所以另一个 class 看起来像

public class GooRun {
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Goo myGoo = new Goo();
    Thread myThread = new Thread(myGoo);
    myThread.start();

}
}

我不完全理解 运行 方法在您不使用 implements Runnable 或 extends Thread 时如何工作。

我得到的错误是构造函数未定义 Thread(Goo) 未定义。

您可以执行以下两项操作之一:

第一个选项:使 myGoo 实现 Runnable:

public class Goo implements Runnable{

然后在Goo中添加一个run方法:

@Override
public void run() {
    try {
        Goo window = new Goo();
        window.frame.setVisible(true);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

之后,你可以像在另一个中那样做 main:

public static void main(String[] args){
    Goo myGoo = new Goo();
    Thread myThread = new Thread(myGoo);
    myThread.start();
}

基本上,这使得 Goo 成为可以在线程启动时启动的东西(因此实现 Runnable)。

选项 2:在您的 main 中,您可以创建一个可运行的线程:

public static void main(String[] args){
    Thread t = new Thread(new Runnable() {
        
        @Override
        public void run() {
            Goo myGoo = new Goo();      
            
        }
    });
    t.start(); 
}

ItamarG3 的解决方案 1 实际上是个坏主意。 在那种情况下,您有 2 个 Goo 实例(一个来自 run(),一个来自 main()),而您不需要它们。

您应该在 run() 中调用 this.frame.setVisible(true); 而不要 new 另一个 Goo 实例。