[英]EventHandlers overriding each other? JavaFX
我有一个上下文菜单,在我的JavaFX应用程序中的节点上单击鼠标右键即可激活。 最初我只有一个菜单项,但是我决定添加另一个。 当我添加另一个菜单时,第二个菜单项起作用,但是第一个菜单项停止工作。 这是我的代码:
final ContextMenu contextMenu = new ContextMenu();
MenuItem delete = new MenuItem("Delete");
MenuItem hyperlink = new MenuItem("Hyperlink...");
contextMenu.getItems().addAll(delete, hyperlink);
//handles deletion
webView.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e){
if (e.isSecondaryButtonDown()){
contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
delete.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event)
{
//do stuff
}
});
}
}
});
//handles hyperlink
webView.setOnMousePressed(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e){
if (e.isSecondaryButtonDown()){
contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
hyperlink.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event)
{
//do stuff
}
});
}
}
});
}
我以为这是因为侦听器彼此覆盖,所以我将其更改为添加事件处理程序。 这是我更改代码的方式:
final ContextMenu contextMenu = new ContextMenu();
MenuItem delete = new MenuItem("Delete");
MenuItem hyperlink = new MenuItem("Hyperlink...");
contextMenu.getItems().addAll(delete, hyperlink);
//handles deletion
webView.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e){
if (e.isSecondaryButtonDown()){
contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
delete.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event)
{
//do stuff
}
});
}
}
});
//handles hyperlink
webView.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e){
if (e.isSecondaryButtonDown()){
contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
hyperlink.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event)
{
//do stuff
}
});
}
}
});
现在,当我右键单击节点时,什么都没有发生。 有人可以解释原因,我的解决方案是什么?
有很多事情:
addEventHandler
样式将使用事件类型MouseEvent.MOUSE_PRESSED
,而不是MOUSE_CLICKED
,因为MOUSE_CLICKED
仅在释放鼠标按钮之后MOUSE_CLICKED
发生,因此isSecondaryButtonDown()
测试始终返回false
这就是为什么什么也没发生的原因。 您可以侦听CONTEXT_MENU_REQUESTED
事件,而不是检测鼠标按下情况:
webView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() { @Override public void handle(ContextMenuEvent e) { contextMenu.show(workspace, e.getScreenX(), e.getScreenY()); } }
您应该在菜单项创建后立即对其进行设置,而不是在每次单击鼠标右键时进行设置:
MenuItem delete = new MenuItem("Delete"); delete.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { //do stuff } });
右键单击唯一需要做的就是显示上下文菜单,如上所示。
您为什么要复制代码。 只需遵循您的第一种方法,并在同一EventHandler中完成这两项操作即可。 另一个注意事项:在webView处理程序之外为MenuItems定义ActionEvent。 现在要做的是每次单击menuItem都在重置ActionEvent。 从您的代码中,我只能看到您只需检测MouseEvent即可显示上下文菜单。 可以在一个webView.setOnMousePressed(...)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.