我只是在列表视图中选择了某些内容时才会显示上下文菜单。 所以我在显示事件中调用了hide。但是,这不起作用。上下文菜单仍然显示。这是一个错误,还是不是它的预期用途?因为JavaFX api似乎建议hide()假设这样做。
无论如何这是代码。
ContextMenu menu = new ContextMenu();
menu.setOnShowing(new EventHandler<WindowEvent>() {
@Override
public void handle(final WindowEvent event) {
menu.hide();
}
});
答案 0 :(得分:1)
如果你
,可能会工作public void handle(final WindowEvent event) {
Platform.runLater(new Runnable() {
@Override
public void run() {
menu.hide();
}
});
}
但这真的是一个可怕的黑客。
为什么不在只选择某些内容时设置上下文菜单?
final ListView<T> listView = ... ;
final ContextMenu menu = new ContextMenu();
listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<T>() {
@Override
public void changed(ObservableValue<? extends T> obs, T oldValue, T newValue) {
if (newValue == null) {
listView.setContextMenu(null);
} else {
listView.setContextMenu(menu);
}
}
});
(显然用T
显示的任何类型替换ListView
。
答案 1 :(得分:0)
private ContextMenu menu; private MenuItem deleteItem;
table.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {
@Override
public void handle(ContextMenuEvent event) {
if (table.getSelectionModel().getSelectedIndex() != -1) {
deleteItem.setVisible(true);
deleteItem.setText("delete: " + table.getSelectionModel().getSelectedItem().getName());
contextMenu.show(table, event.getScreenX(), event.getScreenY());
} else {
deleteItem.setVisible(false);
}
event.consume();
}
});
primaryStage.getScene().addEventHandler(MouseEvent.MOUSE_ENTERED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) { menu.hide(); }});