如何在WebEngine中从javascript调用JavaFX的UI变量?

如何在WebEngine中从javascript调用JavaFX的UI变量?,javascript,java,javafx,javafx-webengine,Javascript,Java,Javafx,Javafx Webengine,我正在开发一个应用程序,该应用程序需要读取本地文件并根据用户输入(在组合框中)在WebView中显示它。 我试图从JavaScript调用JavaFXUI中的一个变量,但它不起作用 我在Java代码中创建了一个名为getMonthIndex()的函数,该函数返回ComboBox的输入,并且应该以适当的名称接收文件。 我正在尝试将此函数导入JavaScript代码,但它似乎没有包含在JavaScript代码中 如果您可以向我解释如何从JavaFXUI获取参数并在JavaScript代码中使用它 提

我正在开发一个应用程序,该应用程序需要读取本地文件并根据用户输入(在
组合框中
)在WebView中显示它。 我试图从JavaScript调用JavaFXUI中的一个变量,但它不起作用

我在Java代码中创建了一个名为
getMonthIndex()
的函数,该函数返回ComboBox的输入,并且应该以适当的名称接收文件。 我正在尝试将此函数导入JavaScript代码,但它似乎没有包含在JavaScript代码中

如果您可以向我解释如何从JavaFXUI获取参数并在JavaScript代码中使用它

提前非常感谢您的帮助

My Controller.java:

public class Controller {

    ObservableList<String> months = FXCollections.observableArrayList
                    ("Tishrei", "Cheshvan", "Kislev", "Tevet", "Shevat", "Adar",
                    "Nisan", "Iyar", "Sivan", "Tammuz", "Av", "Elul");

    public ComboBox<String> month;
    public WebView webView;

    public String getMonthIndex() {
        ReadOnlyIntegerProperty listIndex = month.getSelectionModel().selectedIndexProperty();
        return String.format("%02d", listIndex.getValue());
    }

    public long linesCount(String scanFile) {
        if (scanFile.length() < 80) {
            return scanFile.length() / 15;
        } else {
            return scanFile.length() / 24;
        }
    }

    @FXML
    public void initialize() {
        month.setItems(months);

        webView.setContextMenuEnabled(false);

        WebEngine webEngine = webView.getEngine();
        Controller controller = new Controller();
        JSObject win = (JSObject) webEngine.executeScript("window");
        win.setMember("app", controller);

        month.setOnAction(event -> {
            String loadFile = this.getClass().getResource("index.html").toString();
            webEngine.load(loadFile);
        });
    }
}
公共类控制器{
ObservableList months=FXCollections.observableArrayList
(“蒂什雷”、“切什万”、“基斯列夫”、“特维特”、“谢瓦特”、“阿达尔”,
“尼桑”、“雅尔”、“湿婆”、“塔木兹”、“Av”、“艾露尔”);
公共组合框月;
公共网络视图;
公共字符串getMonthIndex(){
ReadOnlyIntegerProperty listIndex=month.getSelectionModel().selectedIndexProperty();
返回String.format(“%02d”,listIndex.getValue());
}
公共长线扫描(字符串扫描文件){
如果(scanFile.length()<80){
返回scanFile.length()/15;
}否则{
返回scanFile.length()/24;
}
}
@FXML
公共无效初始化(){
月。设置项目(月);
webView.setContextMenuEnabled(false);
WebEngine WebEngine=webView.getEngine();
控制器=新控制器();
JSObject win=(JSObject)webEngine.executeScript(“窗口”);
win.setMember(“应用程序”,控制器);
月设置动作(事件->{
String loadFile=this.getClass().getResource(“index.html”).toString();
加载(loadFile);
});
}
}
My index.html(由WebEngine上传):


函数readTextFile(){
变量xhr,i,文本,行;
xhr=newXMLHttpRequest();
open('GET',app.getMonthIndex()+'.txt',true);
xhr.send(空);
xhr.onreadystatechange=函数(){
text=xhr.responseText;
行=文本。拆分(“\n”);
var allText=“”;
对于(i=0;i”;
}
document.getElementById(“text”).innerHTML=allText;
}
}

您正在创建一个与UI完全没有连接的
控制器的新实例,并将其传递给web引擎:

    Controller controller = new Controller();
     JSObject win = (JSObject) webEngine.executeScript("window");
    win.setMember("app", controller);
相反,只需传递当前实例:

    // Controller controller = new Controller();
    JSObject win = (JSObject) webEngine.executeScript("window");
    win.setMember("app", this);
    // Controller controller = new Controller();
    JSObject win = (JSObject) webEngine.executeScript("window");
    win.setMember("app", this);