使用scan,inJavaFx连续更新标签

时间:2016-03-29 21:51:17

标签: multithreading javafx runnable

我目前正在尝试学习JavaFx,现在我遇到了一个问题。通过使用扫描仪,我想连续在舞台上更新我的标签。

我曾尝试使用platform.runLater,但这只显示了一次更新。每当我在控制台中写新内容时,它都不会更新标签。

这就是我一直在使用的:

          Platform.runLater(new Runnable() {
                @Override
                public void run() {
                  label.setText(sc.nextLine());
                }
           });

2 个答案:

答案 0 :(得分:2)

nextLine()中的Scanner方法是阻止调用:您永远不应该阻止FX应用程序线程。您需要创建一个后台线程来从扫描仪中读取,然后更新FX应用程序线程上的标签:

import java.util.Scanner;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class UpdateLabelFromScanner extends Application {

    @Override
    public void start(Stage primaryStage) {
        Label label = new Label();

        Thread scannerReadThread = new Thread(() -> {
            try (Scanner scanner = new Scanner(System.in)) {
                while (scanner.hasNextLine()) {
                    String line = scanner.nextLine() ;
                    Platform.runLater(() -> label.setText(line));
                }
            } catch (Exception exc) {
                exc.printStackTrace();
            }
        });

        scannerReadThread.setDaemon(true);
        scannerReadThread.start();

        StackPane root = new StackPane(label);
        primaryStage.setScene(new Scene(root, 180, 120));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

答案 1 :(得分:0)

有几种方法可以做到这一点。一种方法是将文本读入可观察的属性,当该属性更改时,您更新标签。可用于执行此操作的对象之一称为SimpleStringProperty

声明如下:

private StringProperty someText = new SimpleStringProperty();

在构造函数或某个初始化函数中,向属性添加新的ChangeListener

someText.addListener((observable, oldValue, newValue) -> {
    Platform.runLater(() -> {
        label.setText(newValue);
    });
});

当您从扫描仪读取输入时,更改您的observable的值并调用您添加的侦听器,从而更改标签的文本:

someText.set(sc.nextLine());