javafx webview / webengine上的自定义上下文菜单 [英] Customized context menu on javafx webview/webengine

查看:139
本文介绍了javafx webview / webengine上的自定义上下文菜单的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如何在 WebEngine javafx中为文档的整个条目设置自定义上下文菜单?

像这样的东西

  + ------------ + 
| Reload |
|保存页面|
|隐藏图片|
+ ------------ +

我喜欢调用并显示整个文档条目的上下文弹出窗口(每个节点都相同)。谢谢。

解决方案

我没有看到与默认上下文菜单交互的方法。但是,禁用它并实现自己并不难。



使用



<$ p $禁用默认上下文菜单p> webView.setContextMenuEnabled();

然后创建自己的上下文菜单,并使用Web视图注册鼠标监听器以在右侧显示点击:

  import javafx.application.Application; 
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;


公共类WebViewContextMenuTest扩展Application {

private final String START_URL =
http://stackoverflow.com/questions/27047447/customized-上下文菜单上JavaFX的网页视图的webengine / 27047830#27047830\" ;

@Override
public void start(Stage primaryStage){
TextField locationField = new TextField(START_URL);
WebView webView = new WebView();
webView.getEngine()。load(START_URL);

webView.setContextMenuEnabled(false);
createContextMenu(webView);

locationField.setOnAction(e - > {
webView.getEngine()。load(getUrl(locationField.getText()));
});
BorderPane root = new BorderPane(webView,locationField,null,null,null);
primaryStage.setScene(new Scene(root,800,600));
primaryStage.show();

}

private void createContextMenu(WebView webView){
ContextMenu contextMenu = new ContextMenu();
MenuItem reload = new MenuItem(Reload);
reload.setOnAction(e - > webView.getEngine()。reload());
MenuItem savePage = new MenuItem(Save Page);
savePage.setOnAction(e - > System.out.println(Save page ...));
MenuItem hideImages = new MenuItem(隐藏图像);
hideImages.setOnAction(e - > System.out.println(隐藏图像...));
contextMenu.getItems()。addAll(reload,savePage,hideImages);

webView.setOnMousePressed(e - > {
if(e.getButton()== MouseButton.SECONDARY){
contextMenu.show(webView,e.getScreenX() ,e.getScreenY());
} else {
contextMenu.hide();
}
});
}

private String getUrl(String text){
if(text.indexOf(://)== - 1){
returnhttp ://+ text;
} else {
返回文字;
}
}

public static void main(String [] args){
launch(args);
}
}


How may I have a customized context menu for whole entry of the document in WebEngine javafx?
Something like this

+------------+
|Reload      |
|Save page   |
|Hide Images |
+------------+

I like to invoke and show this context popup for whole document entry(same for every node). Thanks.

解决方案

I don't see a way to interact with the default context menu. However, it's not hard to disable it and implement your own.

Disable the default context menu with

webView.setContextMenuEnabled();

Then create your own context menu, and register a mouse listener with the web view to show it on right click:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.BorderPane;
import javafx.scene.web.WebView;
import javafx.stage.Stage;


public class WebViewContextMenuTest extends Application {

    private final String START_URL = 
            "http://stackoverflow.com/questions/27047447/customized-context-menu-on-javafx-webview-webengine/27047830#27047830";

    @Override
    public void start(Stage primaryStage) {
        TextField locationField = new TextField(START_URL);
        WebView webView = new WebView();
        webView.getEngine().load(START_URL);

        webView.setContextMenuEnabled(false);
        createContextMenu(webView);

        locationField.setOnAction(e -> {
            webView.getEngine().load(getUrl(locationField.getText()));
        });
        BorderPane root = new BorderPane(webView, locationField, null, null, null);
        primaryStage.setScene(new Scene(root, 800, 600));
        primaryStage.show();

    }

    private void createContextMenu(WebView webView) {
        ContextMenu contextMenu = new ContextMenu();
        MenuItem reload = new MenuItem("Reload");
        reload.setOnAction(e -> webView.getEngine().reload());
        MenuItem savePage = new MenuItem("Save Page");
        savePage.setOnAction(e -> System.out.println("Save page..."));
        MenuItem hideImages = new MenuItem("Hide Images");
        hideImages.setOnAction(e -> System.out.println("Hide Images..."));
        contextMenu.getItems().addAll(reload, savePage, hideImages);

        webView.setOnMousePressed(e -> {
            if (e.getButton() == MouseButton.SECONDARY) {
                contextMenu.show(webView, e.getScreenX(), e.getScreenY());
            } else {
                contextMenu.hide();
            }
        });
    }

    private String getUrl(String text) {
        if (text.indexOf("://")==-1) {
            return "http://" + text ;
        } else {
            return text ;
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

这篇关于javafx webview / webengine上的自定义上下文菜单的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆