【问题标题】:javafx Minesweeper: how to tell between right and left mouse button inputjavafx Minesweeper:如何区分鼠标左右键输入
【发布时间】:2016-03-14 07:33:17
【问题描述】:

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

"当一个按钮被按下和释放时,会发送一个ActionEvent。你的应用程序可以通过实现一个EventHandler来处理ActionEvent来执行一些基于这个事件的动作。按钮也可以通过实现一个EventHandler来处理鼠标事件来响应鼠标事件。”

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());

                    }       
                }   
            }); 

【问题讨论】:

    标签: javafx mouseevent eventhandler minesweeper


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 在我的 EventHandler 之前将此添加到我的代码中,效果很好!能够标记地雷使我的扫雷游戏更接近原版。现在我可以添加一个计时器、地雷左侧计数器和一个确定玩家是否拥有的函数。我认为确定获胜的功能将检查除地雷之外的所有空间是否已被标记或未覆盖。
      【解决方案3】:
       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。这是迄今为止处理主要和次要鼠标单击事件的最简单方法。

      【讨论】:

      • 此代码使用鼠标左键和拖动来旋转场景中的 JavaFX 组。您可以打印 event.getButton 以确保您的主要和次要工作正常。我尝试了许多其他方法,包括 JavaFXtras。这是迄今为止处理主要和次要鼠标单击事件的最简单方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 2011-01-05
      相关资源
      最近更新 更多