如何在JavaFXGUI中不断更新几个文本字段?
在后台线程中保持少数文本字段不断更新的最佳方法是什么?我记录了四旋翼飞行器的一些变量,我把它们保存在课堂上。每次它们改变(100ms)时,我都要更新它们在GUI文本字段中的值。我尝试过使用Task类中的updateMessage()方法,但这样我只能不断更新1个textfield。我需要再添加3或4个变量以保持更新。它运行良好,但只需更新一个变量如何在JavaFXGUI中不断更新几个文本字段?,java,javafx,Java,Javafx,在后台线程中保持少数文本字段不断更新的最佳方法是什么?我记录了四旋翼飞行器的一些变量,我把它们保存在课堂上。每次它们改变(100ms)时,我都要更新它们在GUI文本字段中的值。我尝试过使用Task类中的updateMessage()方法,但这样我只能不断更新1个textfield。我需要再添加3或4个变量以保持更新。它运行良好,但只需更新一个变量 public class ApplicationControler implements Initializable { @FXML privat
public class ApplicationControler implements Initializable {
@FXML
private Canvas artHorizon;
@FXML
public TextField pitchValue;
@FXML
private TextField rollValue;
@FXML
private TextField yawValue;
@FXML
private TextField thrustValue;
@FXML
private Button start;
private Service<Void> backgroundThread;
@Override
public void initialize(URL location, ResourceBundle resources) {
}
@FXML
private void applicationStart(ActionEvent event) {
backgroundThread = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
//This is the place where class which uptades variables starts
updateMessage(DronCoordinator.pitch);
return null;
}
};
}
};
backgroundThread.setOnSucceeded(new EventHandler<WorkerStateEvent>() {
@Override
public void handle(WorkerStateEvent event) {
pitchValue.textProperty().unbind();
}
});
pitchValue.textProperty().bind(backgroundThread.messageProperty());
backgroundThread.restart();
}
}
公共类ApplicationController实现可初始化{
@FXML
私人画布artHorizon;
@FXML
公共文本字段值;
@FXML
私有文本字段值;
@FXML
私有文本字段yawValue;
@FXML
私有文本字段值;
@FXML
私人按钮启动;
私人服务背景线;
@凌驾
公共void初始化(URL位置、ResourceBundle资源){
}
@FXML
私有void应用程序启动(ActionEvent事件){
backgroundThread=新服务(){
@凌驾
受保护的任务createTask(){
返回新任务(){
@凌驾
受保护的Void调用()引发异常{
//这是一个向上提升变量的类开始的地方
更新消息(音调);
返回null;
}
};
}
};
backgroundThread.setOnSucceeded(新的EventHandler(){
@凌驾
公共无效句柄(WorkerStateEvent事件){
pitchValue.textProperty().unbind();
}
});
pitchValue.textProperty().bind(backgroundThread.messageProperty());
backgroundThread.restart();
}
}
您可以将此方法添加到javafx中的文本框中:
textbox.rawText() -> which keeps on updating your textbox whatever is currently in it.
创建可以从任务传递到updateMessage的模型对象。这背后的想法是收集一个对象中的各种值,然后用所有值更新GUI,而不是单独更新每个值。模型可以类似于此:
public class DroneModel {
private double pitch;
private double roll;
private double yaw;
private double thrust;
public double getPitch() {
return pitch;
}
public void setPitch(double pitch) {
this.pitch = pitch;
}
public double getRoll() {
return roll;
}
public void setRoll(double roll) {
this.roll = roll;
}
public double getYaw() {
return yaw;
}
public void setYaw(double yaw) {
this.yaw = yaw;
}
public double getThrust() {
return thrust;
}
public void setThrust(double thrust) {
this.thrust = thrust;
}
}
然后,您的更新方法如下所示:
public void updateMessage(DroneModel model) {
pitchValue.setText(String.valueOf(model.getPitch()));
rollValue.setText(String.valueOf(model.getRoll()));
yawValue.setText(String.valueOf(model.getYaw()));
thrustValue.setText(String.valueOf(model.getThrust()));
}
关键部分是如何调用此更新方法,必须使用runLater,如@RahulSingh所述:
Platform.runLater(() -> updateMessage(droneModel));
如果这与
pitchValue
textfield的预期效果相同,那么对其他3个字段使用相同的方法有什么错?另外,请更具体地说明您希望发生的事情。是否希望在后台同时运行任务时与GUI进行交互?如果这是您想要的,您必须使用Platform.runlater@NonlinearFruit我不能这样做,因为backgroundThread.messageProperty()只是一个字符串,所以当我用4个文本字段绑定同一个messageProperty()时,所有字段都会显示相同的值。@Rahussing我每100毫秒记录一次Quadrotor fly中的一些变量,我把它们放在课堂上。我也想以同样的方式在文本字段中更新它们,但我不需要与GUI交互。如果您正在更新文本字段,那么您是在与GUI交互,不是吗