结合Java Swing和Java3D:并发性能问题

前端之家收集整理的这篇文章主要介绍了结合Java Swing和Java3D:并发性能问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我将Swing和 Java3D结合在一起.挥杆组件的操作应使用事件调度程序线程完成,而Java3D组件的操作应在BehavIoUrSchedulerThread中完成.

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中等待这个行为.

解决方法

哪个WakeupCriterion用于唤醒您的特殊行为对象?

Java 3D的源代码包括实用程序类

com.sun.j3d.utils.behaviors.mouse.MouseBehavior/MouseRotate

它监听Canvas3D的AWTEvents.可以选择两种选择之一:

> MouseListener with WakeupOnBehaviorPost or
> WakeupOnAWTEvent.

代码示例可能有帮助.

通过SwingUtilities.invokeLater从Behavior.processStimulus方法内启动Swing组件更新不应该导致任何问题.

猜你在找的Java相关文章