2017-03-03 22 views
0

私はjavaFxを初めて使用しています。私はグリドルのようなゲームを作りたいと思っています。 最初にやりたいことは、イベント処理の仕組みを理解することです。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に四角形を押していた場合(0,1と0,2で四角形の上に行っている間)私はこの出力を得る0,3を矩形にマウスをgging:

は、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); 
}  
関連する問題