Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将GUI文件作为Java中另一个类的线程运行?_Java_Multithreading_Swing_User Interface_Runnable - Fatal编程技术网

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

如何将GUI文件作为Java中另一个类的线程运行?,java,multithreading,swing,user-interface,runnable,Java,Multithreading,Swing,User Interface,Runnable,使用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() {

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

}
}
我不完全理解在不使用implements Runnable或extends Thread时run方法是如何工作的


我得到的错误是构造函数未定义线程(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(); 
}

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

第一个选项:使
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实际上是个坏主意。 在这种情况下,您有两个
Goo
的实例(一个来自
run()
,另一个来自
main()
),而您不需要它们


您应该调用
this.frame.setVisible(true)run()
中编写>并不要
new
另一个
Goo
实例。

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


您应该调用
this.frame.setVisible(true)run()
中运行code>,不要
new
另一个
Goo
实例。

我可能没有理解程序的要点,但是为什么两个类中都有一个main方法?@JackVanier,一个类必须运行才能调用另一个类来运行
myThread
中您到底想做什么???请记住,Swing和AWT以及基于它的所有系统一样,不是多线程安全的。您在GUI上所做的一切(设置可见、更改文本等)都必须在EDT(事件调度线程)上使用
EventQueue
类完成,就像窗口生成器一样。我可能没有理解你的程序的要点,但是为什么两个类都有一个main方法?@JackVanier,一个类必须运行才能调用另一个类才能运行。在
myThread
中,你到底想做什么???请记住,Swing和AWT以及基于它的所有系统一样,不是多线程安全的。您在GUI上所做的一切(设置可见、更改文本等)都必须在EDT(事件调度线程)上使用
EventQueue
类完成,就像窗口生成器一样。是的@romarshmlow,即使这一个有效,你仍然可以等待得到更多的选择,然后再选择一个最适合你的。现在你已经把一分作为最佳答案,没有人或很少人会对你的问题做出进一步的贡献。尽管如此,这个答案还是很酷。是的@romarshmallow,你仍然可以等待得到更多的选择,即使这一个可行,然后再选择一个最适合你的。现在你已经把一分作为最佳答案,没有人或很少人会对你的问题做出进一步的贡献。尽管如此,这个答案还是很酷的。