如何在不冻结 GUI 的情况下将其设置为 运行
How can I get this to run without freezing the GUI
这是我的代码的一个非常简化的版本,可以更好地理解我在这里做错了什么。如果按下按钮,GUI 会冻结。如果按下按钮而不冻结,我需要能够 运行 一个 while 循环。
class obj1 extends Thread{
public void run(){
while(true) {
System.out.println("this thread should run when the button is pressed and I should be able to press another button");
}
}
}
class GUI extends Thread{
JFrame frame = new JFrame();
JButton button = new JButton("test1");
JButton button2 = new JButton("test2");
JPanel panel = new JPanel();
String command;
public void run() {
frame.setVisible(true);
panel.add(button);
panel.add(button2);
frame.add(panel);
frame.pack();
buttonOnAction();
}
public void buttonOnAction(){
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
obj1 one = new obj1();
one.start();
one.run();
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
obj1 one2 = new obj1();
one2.start();
one2.run();
}
});
}
}
public class Main{
public static void main(String args[]){
GUI gui = new GUI();
gui.start();
gui.run();
}
}
为什么 GUI 冻结?
不要直接在您的 Thread
对象上调用 run()
。这会立即执行 run()
方法并且不会产生新线程。相反,只需按原样调用 start()
并让系统创建线程并在它决定时调用 run()
。
还值得指出的是,在 Swing 中安排 图形 工作的正确方法是确保它在事件分派线程上结束。要正确执行此操作,请使用 SwingUtilities#invokeLater(Runnable)
, which will not wait for the work to complete, or SwingUtilities#invokeAndWait(Runnable)
,这会。
这是我的代码的一个非常简化的版本,可以更好地理解我在这里做错了什么。如果按下按钮,GUI 会冻结。如果按下按钮而不冻结,我需要能够 运行 一个 while 循环。
class obj1 extends Thread{
public void run(){
while(true) {
System.out.println("this thread should run when the button is pressed and I should be able to press another button");
}
}
}
class GUI extends Thread{
JFrame frame = new JFrame();
JButton button = new JButton("test1");
JButton button2 = new JButton("test2");
JPanel panel = new JPanel();
String command;
public void run() {
frame.setVisible(true);
panel.add(button);
panel.add(button2);
frame.add(panel);
frame.pack();
buttonOnAction();
}
public void buttonOnAction(){
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
obj1 one = new obj1();
one.start();
one.run();
}
});
button2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
obj1 one2 = new obj1();
one2.start();
one2.run();
}
});
}
}
public class Main{
public static void main(String args[]){
GUI gui = new GUI();
gui.start();
gui.run();
}
}
为什么 GUI 冻结?
不要直接在您的 Thread
对象上调用 run()
。这会立即执行 run()
方法并且不会产生新线程。相反,只需按原样调用 start()
并让系统创建线程并在它决定时调用 run()
。
还值得指出的是,在 Swing 中安排 图形 工作的正确方法是确保它在事件分派线程上结束。要正确执行此操作,请使用 SwingUtilities#invokeLater(Runnable)
, which will not wait for the work to complete, or SwingUtilities#invokeAndWait(Runnable)
,这会。