gpt4 book ai didi

java - javafx 中的标签未随线程自动更新

转载 作者:行者123 更新时间:2023-12-02 01:22:11 26 4
gpt4 key购买 nike

实际上我是java线程的初学者。为了我的学习目的,我创建了一个简单的程序。我不知道我错过了什么。

代码:

package javaguithread;

import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class Controller {

Thread t1;

@FXML
TextField input;

@FXML
Label output;

@FXML
private void addData() {
output.setText(input.getText());
}

public void initialize() {

t1 = new Thread(() -> {

while (true) {
System.out.println(input.getText());
output.setText(input.getText());
}
});

t1.start();
}
}

它显示的错误是

at com.sun.javafx.tk.Toolkit.checkFxUserThread(
Toolkit.java:236)

已更新

我尝试使用我创建的另一个类来初始化线程。她是我的密码。

package javathreadgui;

import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;

public class Controller {

private class GuiUpdater extends Task<Void> {

Controller ctrl;

GuiUpdater(Controller ctrl) {
this.ctrl = ctrl;
}

@Override
protected Void call() throws Exception {
makeChanges();
return null;
}

private void makeChanges(){
while(true){
Platform.runLater(() -> {
ctrl.output.setText(ctrl.input.getText());
});

System.out.println("test");

}
}

}

@FXML
TextField input;

@FXML
Label output;

public void initialize() {
System.out.println("Hello ");

Task<Void> task = new GuiUpdater(this);

Thread thread = new Thread(task);

thread.setDaemon(true);
thread.start();
}

}

当我将控制台输出设置为

时,它工作得很好
System.out.println("test");

否则 GUI 将卡住。我能为此做什么?

最佳答案

任何 UI 更改都必须在 JavaFX 线程上进行。使用以下代码包装您的 setText() 调用:

Platform.runLater(new Runnable() {
@Override public void run() {
output.setText(input.getText());
}
});

您可以搜索大量有关并发性以及如何通过任务/线程更新 UI 的帖子。但是,如果您真的不想深入了解细节,那么您需要知道的是每个 UI 更新都必须位于 Platform.runLater(...) 调用中。

编辑:

这是一个可能对您有帮助的示例:

import java.util.Scanner;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.stage.Stage;

public class LabelUpdateTest extends Application {

private Label label;

@Override
public void start(Stage stage) throws Exception {
label = new Label("Waiting for input..");
stage.setScene(new Scene(label, 100, 100));
stage.show();

initInputThread();
}

private void initInputThread() {

Scanner input = new Scanner(System.in);

Task<Void> task = new Task<Void>() {
@Override
protected Void call() {
while (true) {
String userInput = input.nextLine();

Platform.runLater(new Runnable() {
@Override
public void run() {
label.setText("Input was : " + userInput);
}
});

}
}
};

Thread th = new Thread(task);
th.setDaemon(true);
th.start();
}

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

关于java - javafx 中的标签未随线程自动更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47150884/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com