2015-04-26 8 views
4

Я хочу реализовать поток, который запускает метод displayQueue в QueueTabPageController каждые пару секунд, чтобы представление таблицы автоматически обновлялось в графическом интерфейсе JavaFX. В настоящее время он обновляется вручную, нажимая кнопку обновления в графическом интерфейсе, но это не идеально. Я пробовал различные методы, используя некоторые примеры здесь, но, похоже, он не работает правильно. Кстати, я новичок в потоках. Любая помощь будет принята с благодарностью.Обновление JavaFX TableView thread

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); 
    } 

} 

спасибо, K

ответ

0

Что-то вроде этого, может быть:

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(); 

Это запустит поток, который вызывает displayQueue (Queue.queue) каждые 5 секунд. Поскольку displayQueue (...) вызывает tableView.setItems (...), он должен быть вызван в Thread Application JavaFX, поэтому необходимо использовать Platform.runLater().

t.setDaemon (true); убедитесь, что поток не препятствует завершению работы JVM, когда все остальные потоки завершены. Есть, вероятно, более эффективные способы управления отключением потоков ...

Смежные вопросы