Мой GUI зависает всякий раз, когда вызывается метод run в потоке, знает ли кто-нибудь почему?
Главный:
try {
// Set System Look and Feel
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (UnsupportedLookAndFeelException e) {
// handle exception
} catch (ClassNotFoundException e) {
// handle exception
} catch (InstantiationException e) {
// handle exception
} catch (IllegalAccessException e) {
// handle exception
}
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
MainFrame frame = new MainFrame(null, null);
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
запустить метод из потока:
public void run() {
while (true) {
System.out.println("test");
}
}
actionListener, который должен запустить поток:
private ActionListener btnStartListener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
robot.run();
}
};
public class RobotThread implements Runnable {
@Override
public void run() {
while (true) {
System.out.println("test");
}
}
}
Это потому, что метод run()
не запускает новый поток. Предполагая, что ссылка вашего robot
ссылается на экземпляр Runnable
вам нужно вызвать следующее:
new Thread(robot).start();
Calling start()
запустит новый поток и вызовет на нем метод run()
. В настоящее время ваш метод run()
запускается в том же потоке, из которого он вызван (в вашем случае поток отправки событий).
run()
неrun()
новый поток - но с swing это поток диспетчеризации событий, а не основной поток, и это приводит к зависанию пользовательского интерфейса.