我有一个上下文菜单,右键单击我的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
}
});
}
}
});
现在,当我右键单击节点时,会发生任何事情。有人可以解释为什么,以及我的解决方案可能是什么?
答案 0 :(得分:0)
有很多事情:
addEventHandler
样式将使用事件类型MouseEvent.MOUSE_PRESSED
,而不是MOUSE_CLICKED
,因为MOUSE_CLICKED
仅在鼠标按钮释放后发生,因此{{1测试总是返回isSecondaryButtonDown()
- 这就是为什么没有发生任何事情。您可以收听false
事件:
CONTEXT_MENU_REQUESTED
您应该在创建后立即设置菜单项的操作,而不是每次右键单击:
webView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {
@Override
public void handle(ContextMenuEvent e) {
contextMenu.show(workspace, e.getScreenX(), e.getScreenY());
}
}
右键单击您需要做的唯一事情是显示上下文菜单,如上所示。
答案 1 :(得分:0)
为什么要复制代码?只需按照您的第一种方法,在同一个EventHandler中执行这两项操作。
还有一点需要注意:为webView处理程序之外的MenuItem定义ActionEvent。您现在正在做的是每次单击要重置ActionEvents的menuItem时。从您的代码中,我只能看到您需要检测MouseEvent才能显示上下文菜单。这可以在一个webView.setOnMousePressed(...)
中完成。