方案即可。我有一个图表,我可以使用右键单击进行平移。这非常有效。然后我在右键单击时添加了菜单。
问题即可。现在,在拖动操作完成后,即使鼠标释放,也会显示右键菜单。
在Java Swing或JavaFX中有没有办法区分鼠标释放和鼠标拖放?
答案 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;
}
}