在web页面中调用JavaFX。

大体上的理念是在JavaFX程序中创建一个接口对象,并通过调用JSObject.setMember()方法使它对JavaScript可见。然后你就可以在JavaScript中调用该对象的public方法、访问public属性了

其中JSObject方法为 javascript Object之意

例子: 使用JavaScript指令退出JavaFX程序

首先,在help.html文件中再添加一行:<p><a href=”about:blank”

οnclick=”app.exit()”>Exit the Application</a></p>。通过点击help.html文件中的“Exit the Application”链接,用户就可以退出WebViewTest这个javaFX程序。如例中展示的那样修改程序来实现这个功能。

粗体代码。JavaApp接口的exit()方法是public的,因此它可以被外部访问。这个方法被调用的时候,就会终止JavaFX程序的运行。

例6-1中的JavaApp接口被设置为JSObject实例的一个成员,因此JavaScript就知道了该接口。在JavaScript中该接口的名称是window.app或者直接就是app,它唯一能被JavaScript调用的方法就是app.exit()

frida Java 加载外部脚本 javafx异步加载_JavaFX

1 help.html页面代码

<html lang="en" >
    <head>
        <meta http-equiv="Content-Type"
              content="text/html; charset=UTF-8">
        <!-- Visibility toggle script -->
        <script type="text/javascript">
            <!--
            function toggle_visibility(id) {
                var e = document.getElementById(id);
                if (e.style.display == 'block')
                    e.style.display = 'none';
                else
                    e.style.display = 'block';
            }
//-->
        </script>
    </head>
    <body>
        <h1>Online Help</h1>
        <p class="boxtitle"><a href="#" οnclick="toggle_visibility('help_topics');"
  class="boxtitle">[+] Show/Hide Help Topics</a></p>
        <ul id="help_topics" style='display:none;'>
            <li>测试</li>
            <li>测试文字</li>
            <li>测试文字3</li>
        </ul>

        <p><a href=”about:blank”

              οnclick="app.exit()">Exit the Application</a></p>
    </body>
</html>

 ——————————————————————————————————

import javafx.application.Platform;

/**
 * @author zhaoyong
 * @Date 2022/10/20
 * @Description
 */
public class JavaApp {

    public void exit() {
        Platform.exit();
    }
}

—————————————————————————————————— 

 

import javafx.beans.value.ObservableValue;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Pos;
import javafx.geometry.VPos;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.Hyperlink;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.concurrent.Worker.State;
import netscape.javascript.JSObject;
class Browser extends Region {
    private HBox toolBar;

    final private static String[] imageFiles = new String[]{//图片路径数组
            "folder_16.jpg",
            "folder_16.jpg",
            "root.jpg",
            "root.jpg",
            "root.jpg"
    };
    final private static String[] captions = new String[]{//标题名称数组
            "Products",
            "Blogs",
            "Documentation",
            "Partners", "Help"
    };

    final private static String[] urls = new String[]{//添加的测试url集合
            "http://www.oracle.com/products/index.html",
            "http://blogs.oracle.com/",
            "http://docs.oracle.com/javase/index.html",
            "http://www.oracle.com/partners/index.html",
            Browser.class.getResource("help.html").toExternalForm()
    };

    final ImageView selectedImage = new ImageView();//实例化图标视图对象
    final Hyperlink[] hpls = new Hyperlink[captions.length];//定义一个新的超级链接对象
    final Image[] images = new Image[imageFiles.length];//创建一个图片数组
    final WebView browser = new WebView();//定义一个浏览器内核对象
    final WebEngine webEngine = browser.getEngine();//获取浏览器引擎
    final Button toggleHelpTopics = new Button("Toggle Help Topics");
    private boolean needDocumentationButton = false;

    public Browser() {
        //apply the styles
        getStyleClass().add("browser");//外观添加样式类

        for (int i = 0; i < captions.length; i++) {
            final Hyperlink hpl = hpls[i] = new Hyperlink(captions[i]);//创建带标题的超级链接对象
            Image image = images[i] =
                    new Image(getClass().getResourceAsStream(imageFiles[i]));//根据文件路径创建相关图片对象
            hpl.setGraphic(new ImageView(image));//超级链接上添加图片
            final String url = urls[i];//具体url的读取
            final boolean addButton = (hpl.getText().equals("Help"));
            hpl.setOnAction((ActionEvent e) -> {//超级链接对象添加点击处理事件处理回调函数机制的编写
                needDocumentationButton = addButton;
                    webEngine.load(url);//让浏览器内核加载url指向的资源

            });
        }



        // create the toolbar
        toolBar = new HBox();
        toolBar.setAlignment(Pos.CENTER);
        toolBar.getStyleClass().add("browser-toolbar");//水平布局盒子对象的外部样式引入
        toolBar.getChildren().addAll(hpls);//水平布局盒子上面添加超级链接对象
        toolBar.getChildren().add(createSpacer());//创建一个空白区域
        //set action for the button
        toggleHelpTopics.setOnAction((ActionEvent t) -> {//让浏览器内核执行js代码,本例中是调用javascript函数
            webEngine.executeScript("toggle_visibility('help_topics')");
        });
        //add components

        // process page loading
        webEngine.getLoadWorker().stateProperty().addListener(
                (ObservableValue<? extends State> ov, State oldState,
                 State newState) -> {
                    toolBar.getChildren().remove(toggleHelpTopics);
                    if (newState == State.SUCCEEDED) {
                        JSObject win
                                = (JSObject) webEngine.executeScript("window");//获取浏览器引擎中的javascript语言中的window全局对象
                        win.setMember("app", new JavaApp());//创建一个全局对象app(类型是前文中自定义的JavaApp类型),将此app对象置入浏览器引擎中的window对象体内(window对象上下文环境中)
                        if (needDocumentationButton) {
                            toolBar.getChildren().add(toggleHelpTopics);
                        }
                    }
                });

        // load the home page
        webEngine.load("http://www.oracle.com/products/index.html");//浏览器引擎初始化url加载
        getChildren().add(toolBar);//添加盒子布局对象到本实例对象的根节点孩子集合上
        getChildren().add(browser);//添加浏览器区域对象到本实例对象的根节点孩子集合上
    }

    private Node createSpacer() {
        Region spacer = new Region();
        HBox.setHgrow(spacer, Priority.ALWAYS);
        return spacer;
    }

    @Override
    protected void layoutChildren() {//浏览器页面初始化页面样式加载重写父类Region对象同名方法
        double w = getWidth();
        double h = getHeight();
        double tbHeight = toolBar.prefHeight(w);
        layoutInArea(browser, 0, 0, w, h - tbHeight, 0, HPos.CENTER, VPos.CENTER);
        layoutInArea(toolBar, 0, h - tbHeight, w, tbHeight, 0, HPos.CENTER, VPos.CENTER);
    }

    @Override
    protected double computePrefWidth(double height) {//浏览器创后宽度设置重写了父类Region对象同名方法
        return 900;
    }

    @Override
    protected double computePrefHeight(double width) {
        return 600;
    }
}