In a single scene graph, if I have more than one Behavior
that wakes up on AWT events, its seems that only one Behavior
will wakeup - the one that is encountered first in a traversal.
The other Behaviors are effectively blocked from hearing
about the event they are also interested in.
Is this a bug? Am I doing something wrong? I've appended
a short example below. Only the Behavior labeled "A"
will wakeup (and print out a message).
Its not obvious from the documentation that things should
work this way. I don't like this property. While, I
appreciate that performance would be more efficient if there
was only one Behavior that would wake up for a particular
event, it limits how well scene graph objects can be encapsulated.
I am trying to develop Java3D components that I can mix and
match in any scene - I am trying to give them independent
responsibility for what they do about AWT events.
I'd appreciate any feedback.
Regards,
Mark
p.s.
// testMultAwt.java - demonstrate how one behavior blocks another
import com.sun.j3d.utils.applet.MainFrame;
import com.sun.j3d.utils.universe.SimpleUniverse;
import java.applet.Applet;
import javax.vecmath.Point3d;
import javax.media.j3d.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class testMultAwt extends Applet
{
public static void main(String[] args)
{ new MainFrame(new testMultAwt(), 200, 200); }
public testMultAwt()
{
// two behaviors, each listening for AWT MousePress
// - if one wakes up it will print a message that
// includes the label passed here to the constructor
// "The Problem" - only "A" will print out messages
BranchGroup scene = new BranchGroup();
scene.addChild(new MouseResponse("A"));
scene.addChild(new MouseResponse("B"));
// bare necessities for a live scene graph
// that includes the above
Canvas3D canv = new Canvas3D(null);
SimpleUniverse univ = new SimpleUniverse(canv);
univ.getViewingPlatform().setNominalViewingTransform();
univ.addBranchGraph(scene);
setLayout(new BorderLayout());
add("Center", canv);
}
Bounds bounds = new BoundingSphere(new Point3d(0f,0f,0f), 100f);
WakeupCondition mousePress = new WakeupOnAWTEvent(MouseEvent.MOUSE_PRESSED);
class MouseResponse extends Behavior
{
String label;
long count = 0;
MouseResponse(String label)
{
super();
this.label = label;
setSchedulingBounds(bounds);
}
public void initialize() { wakeupOn(mousePress); }
public void processStimulus(Enumeration criteria)
{
while (criteria.hasMoreElements()) {
WakeupCriterion criterion =
(WakeupCriterion)criteria.nextElement();
if (criterion instanceof WakeupOnAWTEvent) {
AWTEvent[] event =
((WakeupOnAWTEvent)criterion).getAWTEvent();
for (int i=0 ; i < event.length ; i++, count++)
System.out.println(
"AWTEvent(" + label + ")[" + count + "]"
+ ": " + "event[" + event[i].getID() + "]"
+ " @ " + ((MouseEvent)event[i]).getX()
+ "," + ((MouseEvent)event[i]).getY()
);
}
}
wakeupOn(mousePress);
}
}
}
// end of file
=====================================================================
To subscribe/unsubscribe, send mail to [EMAIL PROTECTED]
Java 3D Home Page: http://java.sun.com/products/java-media/3D/