user607455
user607455

Reputation: 479

JavaFX contextmenu not hiding

I'm trying to show a context menu only when there is something selected in the list view. So I called hide in its on showing event. However, this is not working. The context menu still shows up. Is this a bug, or not its intended use? Because JavaFX api seems to suggest hide() is suppose to do this.

Anyway this is the code.

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

Upvotes: 1

Views: 1520

Answers (2)

Henryk
Henryk

Reputation: 1

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

Upvotes: 0

James_D
James_D

Reputation: 209225

It will probably work if you do

public void handle(final WindowEvent event) {
    Platform.runLater(new Runnable() {
        @Override
        public void run() {
            menu.hide();
        }
    });
}

but that really seems like a horrible hack.

Why not just set the context menu only if something is selected?

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);
        }
    }
});

(obviously replace T with whatever type your ListView is displaying).

Upvotes: 1

Related Questions