如何使用Java.fx更新文本?

时间:2019-05-14 20:07:08

标签: java javafx

我正在尝试使用JavaFX使用GUI编写网络爬虫,但是,我无法让我的GUI显示网络爬虫已找到的链接。 这是我的启动方法。我想将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 :(得分:-2)

使用JavaFX时,任何GUI更新都需要使用方法Platform.runLater(runnable);

import javafx.application.Platform;

...

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

这是因为GUI是单线程的,这意味着只有一个线程在处理GUI更新。使用 Platform.runLater ,您可以让该线程处理自己的业务。如果您不这样做,则GUI线程可能不会使用其他线程(例如主线程或任何其他线程)所做的新更改来更新GUI,或者有时会对其进行更新,有时不会,有时可能会抛出Null指针异常等。

因此,当您想用新值更新GUI元素(例如文本区域,文本字段,标签等)时,请始终使用Platform.runLater。