区分鼠标拖动和鼠标click/released

Differentiate between mouse drag and mouse click/released

场景。我有一个图表,我可以使用右键单击在其上执行平移。这非常有效。然后我完美地添加了右键单击菜单。

问题。现在,即使在拖动操作完成后释放鼠标时,也会显示右键菜单。

在 Java Swing 或 JavaFX 中,有没有办法区分 鼠标释放和鼠标拖动 后释放鼠标?

鼠标事件是相互独立生成的。

我假设您的平移代码与 mousePressed/mouseMoved.

的组合一起工作

所以你需要添加一些逻辑来表明你在"panning mode"。因此,如果您有一个 mousePressed 后跟一个 mouseMoved,您可以设置一个布尔变量来指示 "panning" 模式。

然后在 mouseReleased 代码中你需要检查这个变量。如果 "panning mode" 则关闭 "panning mode" 和 return。否则你在 "popup mode" 中,所以你可以显示弹出窗口。

由于 event.isDragDetect() 始终为真,所以我无法区分事件。我创建了一个 java class 来存储一个布尔值。这需要修改内部 class 中的最终对象状态,而使用布尔包装器 class 是不可能的。后来我根据鼠标点击和鼠标拖动修改最终对象状态。我也在检查鼠标释放是在拖动之后还是没有拖动,如下所示:-

private void addRightClickMenu() {
    final SubMarineBooleanUtilityClass showMenu = new SubMarineBooleanUtilityClass(true);
    final MenuItem graphButton1 = new MenuItem("Save Graph as..");
    graphButton1.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            saveGraphAs();
        }
    });

    final MenuItem graphButton2 = new MenuItem("Reset Graph");

    graphButton2.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            resetGraph(controlGraph1.getLineChart(), controlGraph2.getLineChart());
        }
    });

    final ContextMenu menu = new ContextMenu(graphButton1, graphButton2);

    //Mouse Drag operation cycle=Mouse click+Mouse dragged+Mouse release

    getAnchorPaneGraphView().setOnMouseClicked(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            if (MouseButton.SECONDARY.equals(event.getButton())) {
                showMenu.setValueBoolean(true);
            }
        }
    });

    getAnchorPaneGraphView().setOnMouseReleased(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            if (MouseButton.SECONDARY.equals(event.getButton()) && showMenu.isValueBoolean()) {
                menu.show(getAnchorPaneGraphView(), event.getScreenX(), event.getScreenY());
            }
        }
    });

    getAnchorPaneGraphView().setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            if (MouseButton.SECONDARY.equals(event.getButton())) {
                showMenu.setValueBoolean(false);
            }
        }
    });
}

public class SubMarineBooleanUtilityClass {
boolean valueBoolean=false;

/**
 * @return boolean
 */
public boolean isValueBoolean() {
    return valueBoolean;
}


/** 
 * Constructor passing a boolean values
 * @param value
 */
public SubMarineBooleanUtilityClass(boolean value){
    this.valueBoolean=value;
}

/**set boolean value
 * @param value
 */
public void setValueBoolean(boolean valueBoolean) {
    this.valueBoolean = valueBoolean;
}

}