【问题标题】:How do I run a GUI file as a thread from another class in Java?如何将 GUI 文件作为 Java 中另一个类的线程运行?
【发布时间】:2016-12-15 20:58:38
【问题描述】:

使用window builder时默认的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);
}
}

我想从另一个类作为线程运行它。所以其他类看起来像,

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();

}
}

我不完全理解当您不使用实现 Runnable 或扩展 Thread 时 run 方法是如何工作的。

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

【问题讨论】:

  • 我可能错过了你程序的重点,但为什么你在两个类中都有一个 main 方法?
  • @JackVanier,一个类必须运行才能调用另一个类来运行
  • 你到底想在myThread里面做什么???请记住,作为 AWT 和所有基于它的系统,Swing 不是多线程安全的。您在 GUI 上所做的一切(设置可见、更改文本和其他类似的事情)都必须使用 EventQueue 类在 EDT(事件调度线程)上完成,就像窗口构建器所做的那样。 Read mode about this

标签: java multithreading swing user-interface runnable


【解决方案1】:

您可以做以下两件事之一:

第一个选项:使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(); 
}

【讨论】:

  • 是的 @ romarshmallow,即使这个有效,您仍然可以等待获得更多替代方案,然后再选择最适合您的一个。现在您已将一个标记为最佳答案,没有或很少有人会为您的问题做出进一步贡献。同样,这个答案是
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 2013-03-31
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-05
    • 1970-01-01
    相关资源
    最近更新 更多