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

时间:2015-12-09 06:08:22

标签: javafx mouseevent eventhandler minesweeper

我正在开发javafx Minesweeper游戏,目前我只使用鼠标左键输入。我也想使用鼠标右键,以便用户可以标记可能的炸弹。我查看了Oracle网页上的Button类,它说:

“当按下并释放按钮时,会发送一个ActionEvent。您的应用程序可以通过实现EventHandler来处理ActionEvent来执行基于此事件的某些操作。按钮还可以通过实现EventHandler来处理MouseEvent来响应鼠标事件。“

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

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

包含我当前的EventHandler代码。如果有人能够解释处理右/左鼠标点击的最佳方法,或者指出我在哪里找到该信息的正确方向,我们非常感谢。

MineButton是一个扩展Button的自定义类。我想右键单击标记为“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());

                    }       
                }   
            }); 

3 个答案:

答案 0 :(得分:3)

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

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");
        }
    }
});

答案 1 :(得分:1)

如果你想处理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
                }
            }
        });

答案 2 :(得分:0)

 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。到目前为止,这是处理主要和次要鼠标单击事件的最简单方法。