【问题标题】:Handling multiple events at the same time with JavaFx使用 JavaFx 同时处理多个事件
【发布时间】:2017-03-03 13:30:47
【问题描述】:

我是 javaFx 的新手,我想创建一个类似烤盘的游戏。 我要做的第一件事是了解事件处理的工作原理。

所以,我创建了一个简单的矩形板,并为每个矩形附加了 MouseEvent 和我创建的事件处理程序。

我想做的是: 如果事件是鼠标左键单击,则绘制矩形, 否则,如果事件是 MouseEnter 并且已经按下鼠标左键,则将当前矩形绘制为红色。

我认为它应该是非常基本的,但是当我实现它时,我只按下鼠标并在我单击的第一个矩形上输入,当我关闭鼠标左键单击时,鼠标在最后一个矩形上输入..

这是事件处理程序类:

    public void handle(MouseEvent event) {
    if(event.getEventType().equals(MouseEvent.MOUSE_PRESSED)) {
        System.out.println("Pressed on " + row + ", " + col);
    } else if (event.getEventType().equals(MouseEvent.MOUSE_ENTERED)) {
        System.out.println("Entered " + row + ", " + col);
    }
}

这是我附上活动的地方:

    private void addRectangles() {
    for (int row = 0; row < rows; row++) {
        for (int col = 0; col < cols; col++) {
            Rectangle rectangle = new Rectangle(col * CELL_SIZE, row * CELL_SIZE, CELL_SIZE, CELL_SIZE);
            rectangle.setStroke(Color.WHITE);
            rectangle.addEventHandler(MouseEvent.ANY, new ShapeColorChanger(row, col, rectangle));
            getChildren().add(rectangle);
        }
    }
}

所以,如果我在 0,0 中按下一个矩形并将鼠标拖动到 0,3 矩形(同时在 0,1 和 0,2 的矩形上移动),我会得到这个输出:

输入 0, 0

按下 0, 0

输入 0、3

【问题讨论】:

标签: java javafx


【解决方案1】:

如果检测到拖动手势,则鼠标事件仅传递到手势源。没有其他节点接收鼠标事件。

如果可以通过启动完全拖动并侦听MOUSE_DRAG_ENTERED 事件来处理此行为:

@Override
public void start(Stage primaryStage) {
    Rectangle rect = new Rectangle(100, 100);
    Rectangle rect2 = new Rectangle(200, 200, 100, 100);

    rect.setOnDragDetected(evt -> {
        // start full drag
        rect.startFullDrag();
    });
    rect2.setOnDragDetected(evt -> {
        // start full drag
        rect2.startFullDrag();
    });

    // print something when mouse enters the rects during a drag event.
    rect.setOnMouseDragEntered(evt -> System.out.println("enter"));
    rect2.setOnMouseDragEntered(evt -> System.out.println("enter"));

    Pane root = new Pane(rect, rect2);
    Scene scene = new Scene(root);

    primaryStage.setScene(scene);
    primaryStage.show();
}

【讨论】:

  • 效果很好!但只是为了确保设置事件是这样完成的,而不是通过 setEventHandler 附加事件处理程序?如果有的话,这是更好的做法
【解决方案2】:

这是http://www.java2s.com/Code/Java/JavaFX/Listentoallmouseevents.htm的控制器版本

@Override
public void initialize(URL url, ResourceBundle rb)
{
     //Handles mouse events
     EventHandler<MouseEvent> mouseHandler = new EventHandler<MouseEvent>() { 
         @Override
         public void handle(MouseEvent mouseEvent) {
             System.out.println(mouseEvent.getEventType() + "\n"
                    + "X : Y - " + mouseEvent.getX() + " : " + mouseEvent.getY() + "\n"
                    + "SceneX : SceneY - " + mouseEvent.getSceneX() + " : " + mouseEvent.getSceneY() + "\n"
                    + "ScreenX : ScreenY - " + mouseEvent.getScreenX() + " : " + mouseEvent.getScreenY());
         }
     };

   //Creates 10 rectangles and set the Mouse events.
   List<Rectangle> rContainer = new ArrayList();
   for(int i = 0; i < 10; i++)
   {
       Rectangle rectangle = new Rectangle();
       rectangle.setX(50);
       rectangle.setY(50);
       rectangle.setWidth(200);
       rectangle.setHeight(100);
       rectangle.setOnMouseClicked(mouseHandler);
       rectangle.setOnMouseDragEntered(mouseHandler);
       rectangle.setOnMouseEntered(mouseHandler);
       rectangle.setFill(Color.BLUE);
       rContainer.add(rectangle);
   }

   //You code will be different here. Here you need to add the arraylist to your root. My root is an AnchorPane with id apMain in FXML
   apMain.getChildren().addAll(rContainer);
}    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多