区分鼠标拖动和鼠标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;
}
}
场景。我有一个图表,我可以使用右键单击在其上执行平移。这非常有效。然后我完美地添加了右键单击菜单。
问题。现在,即使在拖动操作完成后释放鼠标时,也会显示右键菜单。
在 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;
}
}