如何在不冻结 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),这会。