Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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
JavaFX刷新TableView线程_Java_Javafx - Fatal编程技术网

JavaFX刷新TableView线程

JavaFX刷新TableView线程,java,javafx,Java,Javafx,我希望实现一个线程,每隔几秒钟在QueueTabPageController中运行displayQueue方法,以便在JavaFXGUI上自动更新表视图。目前,通过按下GUI中的刷新按钮手动更新,但这并不理想。我在这里用一些例子尝试了各种方法,但似乎无法正确运行。顺便说一下,我对线程还不熟悉。任何帮助都将不胜感激 public class QueueTabPageController implements Initializable { @FXML private TableView&

我希望实现一个线程,每隔几秒钟在
QueueTabPageController
中运行
displayQueue
方法,以便在JavaFXGUI上自动更新表视图。目前,通过按下GUI中的刷新按钮手动更新,但这并不理想。我在这里用一些例子尝试了各种方法,但似乎无法正确运行。顺便说一下,我对线程还不熟悉。任何帮助都将不胜感激

public class QueueTabPageController implements Initializable {

  @FXML
  private TableView<Patient> tableView;

  @FXML
  private TableColumn<Patient, String> firstNameColumn;

  @FXML
  private TableColumn<Patient, String> lastNameColumn;

  @FXML
  private TableColumn<Patient, String> timeEnteredColumn;

  @FXML
  private TableColumn<Patient, String> triageAssessmentColumn;

  @FXML
  private QueueTabPageController queueTabPageController;

  private ObservableList<Patient> tableData;

  @Override
  public void initialize(URL arg0, ResourceBundle arg1) {

    assert tableView != null : "fx:id=\"tableView\" was not injected: check your FXML file 'FXMLQueueTabPage.fxml'";

    firstNameColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("firstName"));
    lastNameColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("lastName"));
    timeEnteredColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("time"));
    triageAssessmentColumn.setCellValueFactory(new PropertyValueFactory<Patient, String>("triage"));

    // display the current queue to screen when opening page each time
    displayQueue(Queue.queue);

  }

  /**
   * @param event
   * @throws IOException
   */
  @FXML
  private void btnRefreshQueueClick(ActionEvent event) throws IOException {
    displayQueue(Queue.queue);
  }

  /**
   * @param queue
   */
  public void displayQueue(LinkedList<Patient> queue) {
    tableData = FXCollections.observableArrayList(queue);
    tableView.setItems(tableData);
    tableView.getColumns().get(0).setVisible(false);
    tableView.getColumns().get(0).setVisible(true);
  }

}
公共类QueueTabPageController实现可初始化{
@FXML
私有TableView TableView;
@FXML
private TableColumn firstNameColumn;
@FXML
私有TableColumn lastNameColumn;
@FXML
private TableColumn timeEnteredColumn;
@FXML
私有表列triageAssessmentColumn;
@FXML
专用QueueTabPageController QueueTabPageController;
私有可观测表数据;
@凌驾
公共void初始化(URL arg0,ResourceBundle arg1){
assert tableView!=null:“fx:id=\“tableView\”未被注入:检查FXML文件'FXMLQueueTabPage.FXML';
setCellValueFactory(新的PropertyValueFactory(“firstName”);
setCellValueFactory(新的PropertyValueFactory(“lastName”);
timeEnteredColumn.setCellValueFactory(新属性ValueFactory(“时间”);
triageAssessmentColumn.setCellValueFactory(新的PropertyValueFactory(“triage”));
//每次打开页面时显示要显示的当前队列
显示队列(Queue.Queue);
}
/**
*@param事件
*@抛出异常
*/
@FXML
私有void btnRefreshQueueClick(ActionEvent事件)引发IOException{
显示队列(Queue.Queue);
}
/**
*@param队列
*/
公共无效显示队列(LinkedList队列){
tableData=FXCollections.observableArrayList(队列);
tableView.setItems(tableData);
tableView.getColumns().get(0).setVisible(false);
tableView.getColumns().get(0).setVisible(true);
}
}
谢谢,
K

类似这样的事情可能:

    Thread t = new Thread(() -> {
        while (true) {
            Thread.sleep(5000); // sleep 5 secs
            Platform.runLater(() -> {   // Ensure data is updated on JavaFX thread 
                displayQueue(Queue.queue);
            });
        }
    }); 
    t.setDaemon(true);
    t.start();
这将启动一个线程,该线程每5秒调用一次displayQueue(Queue.Queue)。由于displayQueue(…)调用tableView.setItems(…),因此必须在JavaFX应用程序线程上调用它,因此需要使用Platform.runLater()

t、 setDaemon(true);将确保线程不会阻止JVM在所有其他线程完成后终止。可能有更好的方法来处理线程关闭