区分鼠标拖动和鼠标单击/释放

时间:2015-09-24 13:45:48

标签: java swing javafx-2 javafx-8

方案即可。我有一个图表,我可以使用右键单击进行平移。这非常有效。然后我在右键单击时添加了菜单。

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

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

2 个答案:

答案 0 :(得分:2)

鼠标事件彼此独立生成。

我假设您使用mousePressed / mouseMoved。

的组合来平移代码

因此,您需要添加一些逻辑来指示您处于“平移模式”。因此,如果您有一个mousePressed,然后是mouseMoved,则设置一个布尔变量以指示“平移”模式。

然后在mouseReleased代码中,您需要检查变量。如果“平移模式”,则关闭“平移模式”并返回。否则,您处于“弹出模式”,因此您可以显示弹出窗口。

答案 1 :(得分:0)

由于event.isDragDetect()始终为true,因此我无法区分事件。我创建了一个java类来存储一个布尔值。这是修改内部类中的最终对象状态所必需的,并且使用布尔包装类是不可能的。后来我正在修改基于鼠标单击和鼠标拖动的最终对象状态。我也在检查鼠标是否在拖动之后或没有拖动时如下: -

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

}