Java3D呈现场景,然后执行与场景相关联的所有行为.
我在Canvas3D上启用了MouseListener.事件发布到AWT事件队列中.然后我想根据这些事件修改Java3D环境,所以我使用一个特殊的行为,我可以在其中发布Runnable.这确保Runnable在Java3D的“行为”循环期间执行(并且在“渲染”循环期间不要修改任何内容).
假设行为中的一些操作想修改Swing模型.然后我必须在EDT上发布一个新的Runnable.
这是正确的做法吗?
使用这种技术,我在鼠标监听器上遇到很多问题.我在Java3D模型中更新了一个点,同时我更新了swing GUI.
更新:
问题可以更清楚地定义如下:
我有一个JButton“spin cube”,它有一个ActionListener.一旦ActionListener被触发,它将AWTEvent推送到Java3D行为.一旦行为触发,它会修改场景图,然后修改JButton actionListener和文本,使其成为“停止旋转”.
>点击JButton两次.
>第一个AWTEvent被调度到SpinActionListener.立方体开始旋转,并将JButton actionListener修改为StopSpinningActionListener.
>第二个AWTEvent被派发到StopSpinningActionListener.立方体停止旋转,并将JButton actionListener修改为SpinActionListener.
实际发生的情况如下:
>点击一次JButton两次.两个AWTEvent都被调度到SpinActionListener.这将在J3D行为中创建一个Runnable来执行.
>第一个AWTEvent启动一个计时器来旋转立方体.然后将一个Runnable发布到EDT以修改按钮.
>第二个AWTEvent启动一个计时器来旋转立方体.立方体现在将旋转两倍.然后将一个Runnable发布到EDT以修改按钮.
显然,我不应该依赖于AWTEvent的顺序处理.因为任何SwingUtilities.invokeAndWait()会导致死锁,所以我不得不在EDT中等待这个行为.