JavaFX contextmenu没有隐藏

时间:2014-08-18 17:00:06

标签: javafx

我只是在列表视图中选择了某些内容时才会显示上下文菜单。 所以我在显示事件中调用了hide。但是,这不起作用。上下文菜单仍然显示。这是一个错误,还是不是它的预期用途?因为JavaFX api似乎建议hide()假设这样做。

无论如何这是代码。

ContextMenu menu = new ContextMenu();
menu.setOnShowing(new EventHandler<WindowEvent>() {
    @Override
    public void handle(final WindowEvent event) {
        menu.hide();
    }
});

2 个答案:

答案 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(); }});