Как я могу заставить это работать без остановки GUI - PullRequest
0 голосов
/ 05 февраля 2020

Это очень упрощенная версия моего кода, чтобы лучше понять, что я здесь делаю неправильно. GUI зависает при нажатии кнопки. Я должен быть в состоянии запустить некоторое время l oop, если кнопка нажата без замораживания.

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 зависает?

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

Не вызывайте run() непосредственно на вашем Thread объекте. Это немедленно выполняет метод run() и не порождает новый поток. Вместо этого просто вызовите start(), как у вас есть, и позвольте системе создать поток и вызовите run(), когда он решит.

1 голос
/ 05 февраля 2020

Стоит также указать, что правильный способ запланировать графическую работу в Swing - убедиться, что она попадает в поток диспетчеризации событий. Чтобы сделать это правильно, используйте SwingUtilities#invokeLater(Runnable), который не будет ждать завершения работы, или SwingUtilities#invokeAndWait(Runnable), который будет.

...