如何将GUI文件作为Java中另一个类的线程运行?
使用window builder时的默认GUI代码如下所示如何将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() {
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,你仍然可以等待得到更多的选择,即使这一个可行,然后再选择一个最适合你的。现在你已经把一分作为最佳答案,没有人或很少人会对你的问题做出进一步的贡献。尽管如此,这个答案还是很酷的。