Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaFXGUI中不断更新几个文本字段?_Java_Javafx - Fatal编程技术网

如何在JavaFXGUI中不断更新几个文本字段?

如何在JavaFXGUI中不断更新几个文本字段?,java,javafx,Java,Javafx,在后台线程中保持少数文本字段不断更新的最佳方法是什么?我记录了四旋翼飞行器的一些变量,我把它们保存在课堂上。每次它们改变(100ms)时,我都要更新它们在GUI文本字段中的值。我尝试过使用Task类中的updateMessage()方法,但这样我只能不断更新1个textfield。我需要再添加3或4个变量以保持更新。它运行良好,但只需更新一个变量 public class ApplicationControler implements Initializable { @FXML privat

在后台线程中保持少数文本字段不断更新的最佳方法是什么?我记录了四旋翼飞行器的一些变量,我把它们保存在课堂上。每次它们改变(100ms)时,我都要更新它们在GUI文本字段中的值。我尝试过使用Task类中的updateMessage()方法,但这样我只能不断更新1个textfield。我需要再添加3或4个变量以保持更新。它运行良好,但只需更新一个变量

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交互,不是吗