[英]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.