我把Swing和Java3D结合在一起。swing组件的操作应该使用事件分派程序线程来完成,而Java3D组件的操作应该在BehaviourSchedulerThread中完成。
Java3D呈现场景,然后执行与场景关联的所有行为。
我在MouseListener上启用了Canvas3D。事件被提交到AWT事件队列中。然后,我想根据这些事件修改Java3D环境,所以我使用了一种特殊的行为,在这里我可以发布Runnable的命令。这可以确保在Java3D的行为周期中执行Runnable的操作(并且在呈现周期中不要修改anyting )。
假设行为中的一些操作希望修改Swing模型。然后,我不得不张贴一个新的运行到美国东部时间。
这样做对吗?
使用这种技术,我在鼠标侦听器上遇到了很多问题。我在行为中更新了Java3D模型中的一个点,同时更新了swing GUI。
更新:问题可以更明确地定义如下:
我有一个JButton“自旋立方体”,它有一个ActionListener。一旦ActionListener被触发,它就会将AWTEvent推入Java3D行为。一旦行为触发,它就会修改场景图,然后修改JButton actionListener和文本,使其成为“停止旋转”。
实际发生的情况如下:
AWTEvent都被分派到SpinActionListener。这将创建一个可在Behavior.。
显然,我不应该依赖AWTEvent按顺序处理。我不能在EDT中等待行为触发,因为任何SwingUtilities.invokeAndWait()都会导致死锁。
发布于 2012-01-13 17:48:02
哪个WakeupCriterion用来唤醒您的特殊行为对象?
Java3D的源代码包括实用程序类
com.sun.j3d.utils.behaviors.mouse.MouseBehavior/MouseRotate 听Canvas3D的AWTEvents。可选择两种备选方案之一:
MouseListener与WakeupOnBehaviorPost或WakeupOnAWTEvent.此代码示例可能会有所帮助。
在Behavior.processStimulus方法中通过SwingUtilities.invokeLater启动Swing组件更新不会造成任何问题。
https://stackoverflow.com/questions/8847812
复制相似问题