如何在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);