Как обновить текст с помощью Java.fx? - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь написать веб-сканер с графическим интерфейсом, используя JavaFX, однако я не могу заставить свой графический интерфейс отображать ссылки, найденные веб-сканером.Это мой метод начала.Я хочу, чтобы urlsText обновлялся до this.urls.Любая помощь будет принята с благодарностью!Спасибо!

@Override
    public void start(Stage primaryStage) {
        this.c = new WebCrawler();
        primaryStage.setTitle("WebCrawler");

        //layout1
        TextField searchInput = new TextField();
        TextField keyword = new TextField();
        Label searchLabel = new Label("Website URL");
        searchLabel.setLabelFor(searchInput);
        Label keywordLabel = new Label("Search for keyword");
        keywordLabel.setLabelFor(keyword);
        Button searchButton = new Button();
        searchButton.setText("Search!");
        searchButton.setOnAction(e -> {
            if (this.checkURL(searchInput.getText())) {
                this.urls = this.c.run(searchInput.getText(), keyword.getText());
                primaryStage.setScene(scene2);
            }
        });
        VBox layout1 = new VBox(10);
        layout1.setPadding(new Insets(20, 20, 20, 20));
        layout1.getChildren().addAll(searchLabel, searchInput, keywordLabel, keyword, searchButton);
        scene1 = new Scene(layout1, 300, 250);

        //layout 2
        Text urlsText = new Text(10, 50, this.urls);
        urlsText.setFont(new Font(20));
        Label urlsLabel = new Label("URLs found: ");
        urlsLabel.setLabelFor(urlsText);
        Button backButton = new Button();
        backButton.setText("Back");
        backButton.setOnAction(e -> primaryStage.setScene(scene1));
        Button serializeButton = new Button();
        serializeButton.setText("Save as .txt File");
        serializeButton.setOnAction(e -> c.serialize());

        VBox layout2 = new VBox(10);
        layout2.setPadding(new Insets(20, 20, 20, 20));
        layout2.getChildren().addAll(urlsLabel, urlsText, backButton, serializeButton);
        scene2 = new Scene(layout2, 300, 250);

        primaryStage.setScene(scene1);
        primaryStage.show();
    }

1 Ответ

0 голосов
/ 14 мая 2019

При использовании JavaFX любые обновления графического интерфейса должны выполняться по методу Platform.runLater(runnable);:

import javafx.application.Platform;

...

Platform.runLater(() -> {
    textArea.appendText("New text");
});

Это потому, что графический интерфейсявляется однопоточным , что означает, что только один поток обрабатывает обновления GUI.Используя Platform.runLater , вы позволяете этому потоку заниматься своим делом.Если вы не сделаете это таким образом, поток GUI может не обновлять GUI новыми изменениями, сделанными из другого потока, например основного потока или любого другого, или иногда обновит его, иногда не будет, иногда может выдать NullИсключения указателей и т. Д.

Поэтому всегда используйте Platform.runLater, если вы хотите обновить элементы графического интерфейса новыми значениями, такими как текстовые области, текстовые поля, метки и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...