2017-03-03 143 views
0

我是javaFx的新手,我想创建一个类似griddles的游戏。 我想要做的第一件事是了解事件处理如何工作。用JavaFx同时处理多个事件

所以,我创建了一个简单的矩形板,并用MouseEvent和一个事件处理程序iv'e创建了每个矩形。

我想要做的是: 如果该事件被点击鼠标左键,绘制在矩形, 否则,如果该事件的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和DRA按下一个矩形gging鼠标矩形0.3(而在0,1和0,2去在矩形)我得到这样的输出:

输入0,0

压在0,0

输入0 ,3

+0

控制器版本,你是什么意思?我也尝试拆分成MouseEvent.Pressed和MouseEvent.Entered,但得到了相同的结果 – TalOhana

+0

去这里这是你需要的。 http://www.java2s.com/Code/Java/JavaFX/Listentoallmouseevents.htm – Sedrick

回答

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(); 
} 
+0

它很好用!但只是为了确保,设置事件是这样完成的,而不是通过setEventHandler附加事件处理程序?如果有的话,这是更好的做法 – TalOhana

0

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