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.

Другие вопросы по тегам