我目前正在尝试学习JavaFx,现在我遇到了一个问题。通过使用扫描仪,我想连续在舞台上更新我的标签。
我曾尝试使用platform.runLater,但这只显示了一次更新。每当我在控制台中写新内容时,它都不会更新标签。
这就是我一直在使用的:
Platform.runLater(new Runnable() {
@Override
public void run() {
label.setText(sc.nextLine());
}
});
答案 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());