javafx Minesweeper:如何区分鼠标左右键输入

javafx Minesweeper: how to tell between right and left mouse button input

我正在开发 javafx 扫雷游戏,目前只使用鼠标左键输入。我还想使用鼠标右键,以便用户可以标记可能的炸弹。我查看了 Button class 的 Oracle 网页,上面写着:

"When a button is pressed and released a ActionEvent is sent. Your application can perform some action based on this event by implementing an EventHandler to process the ActionEvent. Buttons can also respond to mouse events by implementing an EventHandler to process the MouseEvent."

https://docs.oracle.com/javafx/2/api/javafx/scene/control/Button.html

我尝试了几种不同的方法,但都没有成功。

包括我当前的 EventHandler 代码。如果有人能解释处理 right/left 鼠标点击的最佳方法,或者指出正确的方向以找到该信息,我们将不胜感激。

MineButton 是一个扩展 Button 的自定义 class。我想右键单击标记为 "m" 并更改单元格颜色,左键单击将保持不变。

    for (int row = 0; row < 8; row++){
        for (int col = 0; col <8; col++){

            MineButton button = new MineButton(row, col);
            button.setPrefSize(100, 100);
            button.setText("?");
            button.setStyle("-fx-font: 22 arial; -fx-base:#dcdcdc;");
            button.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {

                    if ( button.isAMine() == true){
                        button.setText("B");

                        for( int row1 = 0; row1 < 8; row1++){
                            for ( int col1 = 0; col1 < 8; col1++){

                            if (mineButtons[row1][col1].isAMine() == true){
                                    mineButtons[row1][col1].setText("B");
                                    mineButtons[row1][col1].setStyle("-fx-   font: 22 arial; -fx-base: #dc143c;");
                                }
                            }
                        }
                    }
                    else{

                        recursion(mineButtons, button.getX(), button.getY());

                    }       
                }   
            }); 

您无法通过在操作事件上附加事件处理程序来处理按钮上的右键单击。相反,您需要向鼠标事件添加处理程序:

button.setOnMouseClicked(new EventHandler<MouseEvent>() {
    @Override
    public void handle(MouseEvent mouseEvent) {
        if(mouseEvent.getButton().equals(MouseButton.SECONDARY)){
            System.out.println("Set flag on the button");
        }
    }
});

如果您想处理 MouseEvent,请使用此代码。它会起作用。

button.addEventFilter(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                if(event.getButton() == MouseButton.SECONDARY){
//                  Type code to set flag here
                }
            }
        });
 scene.setOnMousePressed(event ->{
        if(event.getButton() == MouseButton.PRIMARY) {
            anchorX = event.getSceneX();
            anchorY = event.getSceneY();
            anchorAngleX = angleX.get();
            anchorAngleY = angleY.get();
        }
    });
    scene.setOnMouseDragged((MouseEvent event) -> {
        if(event.getButton() == MouseButton.PRIMARY) {
            angleX.set(anchorAngleX - (anchorY - event.getSceneY()));
            angleY.set(anchorAngleY - (anchorX - event.getSceneX()));
        }
    });

此代码使用鼠标左键和拖动在场景中旋转 JavaFX 组。您可以打印 event.getButton 以确保您的主要和次要工作正常。我尝试了许多其他方法,包括 JavaFXtras。这是迄今为止处理主要和次要鼠标单击事件的最简单方法。