Как вызвать переменную пользовательского интерфейса JavaFX из javascript в WebEngine? - PullRequest
0 голосов
/ 04 мая 2020

Я работаю над приложением, которое должно прочитать локальный файл и отобразить его в WebView на основе пользовательского ввода (в ComboBox). Я пытаюсь вызвать переменную в пользовательском интерфейсе JavaFX из JavaScript, и она не работает.

Я создал функцию с именем getMonthIndex() в коде Java, которая возвращает ввод ComboBox и этот файл должен быть получен с соответствующим именем. Я пытаюсь импортировать эту функцию в код JavaScript, и она, похоже, не включена в код JavaScript.

Если вы можете объяснить мне, как получить параметр из JavaFX UI и используйте его в коде JavaScript.

Заранее большое спасибо за любую помощь, которую вы можете.

Мой контроллер. 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);
        });
    }
}

Мой индекс. html (загружено WebEngine):

<html>
    <head>
        <meta charset="UTF-8">
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>

    <body onload="readTextFile()">
        <div id="text">
        </div>
        <script type="text/javascript">
            function readTextFile() {
                var xhr, i, text, lines;
                xhr = new XMLHttpRequest();
                xhr.open('GET', app.getMonthIndex()+'.txt', true);
                xhr.send(null);
                xhr.onreadystatechange = function(){
                    text = xhr.responseText;
                    lines = text.split("\n");
                    var allText = "";
                    for(i = 0; i < lines.length; i++){
                        allText += lines[i]+"<br>";
                    }
                    document.getElementById("text").innerHTML = allText;
                }
            }
        </script>
    </body>
</html>

1 Ответ

0 голосов
/ 04 мая 2020

Вы создаете новый экземпляр Controller, который вообще не имеет связи с пользовательским интерфейсом, и передаете его веб-движку:

    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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...