【发布时间】:2018-04-19 10:31:56
【问题描述】:
其实我是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 冻结。我能做些什么呢?
【问题讨论】:
-
请发布完整的错误日志
-
这只是一个错误。
-
控制器初始化时为什么要在新线程下设置输出标签的文本??
-
我不想用线程自动更新标签。我知道还有另一种不使用线程的方法。但只是为了我的学习目的,我正在使用线程。
-
你实际上可以很容易地做到这一点,使用
output.textProperty().bind(input.textProperty());。
标签: java multithreading javafx