Я объединяю Swing и Java3D вместе. Манипуляции с компонентами Swing должны выполняться с помощью потока диспетчера событий, а манипуляции с компонентами Java3D должны выполняться в BehaviourSchedulerThread.
Java3D визуализирует сцену, а затем выполняет все действия, связанные со сценой.
У меня включен MouseListener на Canvas3D. События помещаются в очередь событий AWT. Затем я хочу изменить среду Java3D на основе этих событий, поэтому я использую специальное поведение, в котором я могу опубликовать Runnable. Это гарантирует, что Runnable выполняются во время цикла Behavior Java3D (и не изменяют ничего во время цикла Render).
Предположим, что некоторые операции в поведении хотят изменить модель Swing. Затем мне нужно отправить новый Runnable в EDT.
Это правильный способ сделать это?
Используя эту технику, я испытываю множество проблем с обработчиком мыши. Я обновляю точку в своей модели Java3D в поведении и одновременно обновляю графический интерфейс Swing.
Обновление : Проблема может быть более четко определена следующим образом:
У меня есть «спиновый куб» JButton, который имеет ActionListener. После запуска ActionListener подталкивает AWTEvent к Java3D Behavior.Как только Behavior запускается, он изменяет граф Scene, а затем изменяет JButton actionListener и текст, чтобы он стал «Stop spinning».
StopSpinningActionListener
. SpinActionListener
. На самом деле происходит следующее:
AWTEvent
отправляются в SpinActionListener
. Это создает Runnable для выполнения внутри J3D Behavior. Очевидно, я не должен зависеть от последовательной обработки AWTEvent. Я не могу ждать в EDT, пока сработает поведение, потому что любой SwingUtilities.invokeAndWait () вызовет тупик.