Marek
Marek

Reputation: 167

Blocking/disabling JavaFX 2 WebView right click

I'm looking for a way to block/disable right click in javafx.scene.web.WebView. To be more specific I don't want the context menu to show up on right click. I'm new to the technology and can't find the way to do it.

Upvotes: 5

Views: 9152

Answers (7)

Peter Hull
Peter Hull

Reputation: 7077

Just for the record, it is implemented in JavaFX 2.2. See documentation for setContextMenuEnabled (JavaFX 2) and setContextMenuEnabled (JavaFX 8)

Upvotes: 15

Rémy J
Rémy J

Reputation: 108

With JavaFX 2.2+ it's now possible to set WebView's ContextMenuEnabled to false:

webView.setContextMenuEnabled(false);

WebView API Doc.

Upvotes: 4

hemisphire
hemisphire

Reputation: 1235

This will will remove the context menu for the entire stage:

primaryStage.getScene().addEventFilter(MouseEvent.MOUSE_RELEASED, 
            new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) {
        if (event.getButton() == MouseButton.SECONDARY) {
            event.consume();
        }

    }
});

Upvotes: 1

guai
guai

Reputation: 805

You can do it with js (jquery used)

$(document).ready( function() { document.oncontextmenu = function() { return false } } );

Upvotes: 3

jewelsea
jewelsea

Reputation: 159546

You can style context menus away using the following css.

.context-menu     { -fx-background-color: transparent; }
.menu-item        { -fx-background-color: transparent; }
.menu-item .label { -fx-text-fill: transparent; }
.menu-item:show-mnemonics .mnemonic-underline { -fx-stroke: -transparent; }

This will make all context menus and menu items transparent. I'm not sure of the css selector you could use to make this only apply to WebView context menus. If you don't have other menus in your application, that may not be a big deal.

Upvotes: 3

Marek
Marek

Reputation: 167

I've came up with working, but ugly, inelegant and, I'd say, partisan solution, which I don't really like, but actually I have no (or just can't find) other way out.

It includes modifying EventDispatcher of WebView.

So my implementation of EventDispatcher needs a reference to original WebView EventDispatcher and looks like that:

public class MyEventDispatcher implements EventDispatcher {

private EventDispatcher originalDispatcher;

public MyEventDispatcher(EventDispatcher originalDispatcher) {
    this.originalDispatcher = originalDispatcher;
}

@Override
public Event dispatchEvent(Event event, EventDispatchChain tail) {
    if (event instanceof MouseEvent) {
        MouseEvent mouseEvent = (MouseEvent) event;
        if (MouseButton.SECONDARY == mouseEvent.getButton()) {
            mouseEvent.consume();
        }
    }
    return originalDispatcher.dispatchEvent(event, tail);
}
}

Everytime event is dispatched it goes through our dispatcher and I check if it's right click. If it is I just consume it and proceed further.

To make it work you have to use WebView like that:

WebView webView = new WebView();
EventDispatcher originalDispatcher = webView.getEventDispatcher();
webView.setEventDispatcher(new MyEventDispatcher(originalDispatcher));

Every comment, clue and so on are appreciated.

Upvotes: 5

Sergey Grinev
Sergey Grinev

Reputation: 34528

Unfortunately it's not yet possible. There is a feature request for that, which you may want to track: http://javafx-jira.kenai.com/browse/RT-15684

Upvotes: 2

Related Questions