Java Swing Threading: GUI зависает при выполнении логических команд
В настоящее время я работаю над проектом по разработке управления Parrot AR Drone 2.0 Power Edition.
Для этого мы используем библиотеку YaDrone ( https://vsis-www.informatik.uni-hamburg.de/oldServer/teaching/projects/yadrone/) для управления дроном. Вокруг этой библиотеки был создан класс DroneController для большего контроля. По сути, это вся логика, используемая для беспилотника.
В Java Swing был разработан графический интерфейс для отображения различной информации о дроне.
Проблема, с которой мы сталкиваемся, заключается в том, что когда программа выполняется, то есть дрон запускается, графический интерфейс открывается, но зависает / зависает до тех пор, пока дрон не отправит и не выполнит все команды дрону.
Очевидно, мы бы хотели, чтобы графический интерфейс обновлялся одновременно с отправкой команд дрону.
Мы экспериментировали с SwingUtilities и тому подобным, но не повезло. Это текущий основной класс:
Основной класс Весь код проекта можно посмотреть здесь: https://github.com/tMascagni/CDIO_3/tree/dev (в частности, в ветке dev.)
Наиболее важными частями этого пакета являются пользовательский интерфейс Main.java и DroneController.java.
Если у кого-нибудь есть идеи, как решить эту проблему, я буду очень признателен за любые отзывы!
1 ответ
В целом, будет работать следующий подход:
Thread t = new Thread(()->{
// this code will be executed outside the EDT thread,
// and will not make the interface non-responsive
// ...
SwingUtilities.invokeLater(()->{
// and this code will execute once the above code is finished,
// within the EDT thread, and can report on results
});
}).start();
Более упрощенный подход, но несколько более сложный для реализации, заключается в использовании SwingWorker.