簡體   English   中英

使用JavaFx同時處理多個事件

[英]Handling multiple events at the same time with JavaFx

我是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

如果檢測到拖動手勢,則鼠標事件僅傳遞到手勢源。 沒有其他節點接收到鼠標事件。

如果可以通過啟動完全拖動並偵聽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();
}

這是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);
}    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM