Java3D и Поведения: KeyNavigatorBehaviour работает нормально, но не MouseRotate - PullRequest
0 голосов
/ 08 июня 2011

Мне не удается настроить взаимодействие мыши с ColorCube с помощью MouseRotate. Однако, когда я использую KeyNavigatorBehaviour, я могу управлять кубом с клавиатуры при необходимости.

Вот код, который я использовал для проверки MouseRotate:

import javax.media.j3d.BoundingSphere;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.GraphicsConfigTemplate3D;
import javax.media.j3d.TransformGroup;
import javax.swing.JFrame;
import javax.vecmath.Point3d;

import com.sun.j3d.exp.swing.JCanvas3D;
import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
import com.sun.j3d.utils.geometry.ColorCube;
import com.sun.j3d.utils.universe.SimpleUniverse;


public class MovingAroundCube extends JFrame {

    private static final long serialVersionUID = 1L;

    public MovingAroundCube(){
        setTitle("Moving around cube");
        setSize(300,300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);

        JCanvas3D jCanvas3D = new JCanvas3D(new GraphicsConfigTemplate3D());
        jCanvas3D.setSize(300, 300);
        add(jCanvas3D);
        SimpleUniverse universe = new SimpleUniverse(jCanvas3D.getOffscreenCanvas3D());
        universe.getViewingPlatform().setNominalViewingTransform();
        universe.addBranchGraph(createSceneGraph());
    }

    public BranchGroup createSceneGraph() {
        BranchGroup objRoot = new BranchGroup();

        TransformGroup listenerGroup = new TransformGroup();
        listenerGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);
        listenerGroup.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);
        objRoot.addChild(listenerGroup);

        //KeyNavigatorBehavior behaviour = new KeyNavigatorBehavior(listenerGroup);
        MouseRotate behaviour = new MouseRotate(listenerGroup);
        behaviour.setSchedulingBounds(new BoundingSphere(new Point3d(), 100));

        listenerGroup.addChild(behaviour);
        listenerGroup.addChild(new ColorCube(0.4));

        return objRoot;
    }

    public static void main(String[] args) {
        new MovingAroundCube().setVisible(true);
    }


}

Если я раскомментирую строку, создающую KeyNavigatorBehaviour, и прокомментирую строку, создающую MouseRotate, взаимодействие с пользователем на этот раз возможно.

Итак, почему куб не может реагировать на мышь (когда я использую экземпляр поведения MouseRotate)?

Любая помощь будет оценена.

Система: Xubuntu 11.04 Версия Java3D: 1.5.2

1 Ответ

0 голосов
/ 08 июня 2011

Есть два способа решить эту дилемму:

  • Использовать этот конструктор:

    MouseRotate behaviour = new MouseRotate(jCanvas3D, listenerGroup);

или

  • Включить события мышидо тех пор, пока не добавлены MouseListeners:

    import java.awt.AWTEvent;

    JCanvas3D jCanvas3D = new JCanvas3D(new GraphicsConfigTemplate3D()) {
        {
            this.enableEvents(AWTEvent.MOUSE_EVENT_MASK | 
                              AWTEvent.MOUSE_MOTION_EVENT_MASK |
                              AWTEvent.MOUSE_WHEEL_EVENT_MASK);
        }
    };

События ключа включены, поскольку в JCanvas3D установлено значение 'setFocusable (true)'.

Август, InteractiveMesh

...