SubScene中的JavaFX 2.2 MouseEvent无法正常工作

时间:2014-02-21 15:14:16

标签: javafx-2 mouseevent

我试图让它工作一段时间,我无法弄清楚我的代码有什么问题。这让我相信SubScene Mouse监听器存在一些问题。任何想法都表示赞赏。

基本上我有一个包含两个子场景的场景,一个用于工具栏,另一个用于地板,其中有一堆线条使其看起来像瓷砖。我添加了鼠标监听器,这样当我点击地板并移动鼠标时,摄像机就会移动,好像我在地板上行走一样。 问题是,当我点击第一个垂直线和第一个水平线之间的交叉点时,地板只能识别鼠标事件(是的,我花了一些时间才弄明白)。鼠标事件应该发生在整个楼层。

这是代码。

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.PerspectiveCamera;
import javafx.scene.Scene;
import javafx.scene.SceneAntialiasing;
import javafx.scene.SubScene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.shape.Line;
import javafx.stage.Stage;

public class FloorTest extends Application {

double mousex, mousey;

@Override
public void start(Stage primaryStage) {
    Button btn = new Button();
    btn.setText("Say 'Hello World'");
    btn.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            System.out.println("Hello World!");
        }
    });

    Group bargroup = new Group();
    SubScene bar = new SubScene(bargroup, 300, 20, true, SceneAntialiasing.DISABLED); 
    bargroup.getChildren().add(btn);

    Group floorgroup = new Group();
    SubScene floor = new SubScene(floorgroup, 300, 250, true, SceneAntialiasing.DISABLED);
    ObservableList<Node> list = floorgroup.getChildren();
    for(int i = 0; i < (300/20); i++)
    {
        double x = i * 20;
        Line line = new Line(x, 0, x, 250);
        list.add(line);
    }
    for(int i = 0; i < (250/20); i++)
    {
        double y = i * 20;
        Line line = new Line(0, y, 300, y);
        list.add(line);
    }

    PerspectiveCamera camera = new PerspectiveCamera(false);
    camera.setNearClip(0.1);
    camera.setFarClip(10000.0);
    camera.setTranslateZ(-200);
    floor.setCamera(camera);

    floor.setOnMousePressed((MouseEvent event) -> {
        mousex = event.getSceneX();
        mousey = event.getSceneY();
    });

    floor.setOnMouseDragged((MouseEvent event) -> {
        double x = event.getSceneX();
        double y = event.getSceneY();
        camera.relocate(camera.getLayoutX() + (x - mousex), camera.getLayoutY() + (y - mousey));
    });



    Group mainroot = new Group();
    mainroot.getChildren().addAll(floor, bar);        

    Scene scene = new Scene(mainroot, 300, 250, true);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

/**
 * The main() method is ignored in correctly deployed JavaFX application.
 * main() serves only as fallback in case the application can not be
 * launched through deployment artifacts, e.g., in IDEs with limited FX
 * support. NetBeans ignores main().
 *
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

2 个答案:

答案 0 :(得分:0)

请尝试在事件处理程序中使用scene代替floor变量

示例:

scene.setOnMousePressed((MouseEvent event) -> {
    mousex = event.getSceneX();
    mousey = event.getSceneY();
});

 scene.setOnMouseDragged((MouseEvent event) -> {
        double x = event.getSceneX();
        double y = event.getSceneY();
        camera.relocate(camera.getLayoutX() + (x - mousex), camera.getLayoutY() + (y - mousey));
    });

这有助于我

答案 1 :(得分:0)

似乎设置subscene.setPickOnBounds(true)应该有助于正确识别整个子场景的鼠标事件。用javafx 8进行测试。