2016-04-06 4 views
0

Проблема. Невозможно заполнить данные в реальном времени в TreeTableView. Данные поступают из внешнего источника. & должен отображаться в TreeTableView в реальном времени.Данные в реальном времени JavaFx TreeTableView

Ниже приводится краткая часть кода. Могу создать представление таблицы деревьев с узлами. Для тестирования я создал генератор случайных чисел &, связанный с полем просмотра дерева таблиц. Не уверен, что это правильный подход.

Надеюсь, мне удалось четко объяснить проблему. Посмотрите вперед к руководству.

FXML:

<TreeTableColumn fx:id="car" prefWidth="150.0" text="Car" /> 
         <TreeTableColumn fx:id="latest" prefWidth="75.0" text="Latest" /> 
          <TreeTableColumn fx:id="high" prefWidth="75.0" text="High" /> 
          <TreeTableColumn fx:id="low" prefWidth="75.0" text="Low" /> 

Контроллер:

public void initialize(URL location, ResourceBundle resources) { 
    // Initialize Table Views 
    car.setCellValueFactory((CellDataFeatures<TableCarMain, String> p) -> new ReadOnlyStringWrapper(
      p.getValue().getValue().getCar())); 

    latest.setCellValueFactory((CellDataFeatures<TableCarMain, String> p) -> new ReadOnlyStringWrapper(
      p.getValue().getValue().getLatest())); 

    high.setCellValueFactory((CellDataFeatures<TableCarMain, String> p) -> new ReadOnlyStringWrapper(
      p.getValue().getValue().getHigh())); 

    low.setCellValueFactory((CellDataFeatures<TableCarMain, String> p) -> new ReadOnlyStringWrapper(
      p.getValue().getValue().getLow())); 

// Create Main Nodes 
    final TreeItem<TableCarMain> root = new TreeItem<>(new TableCarMain("Vehicles")); 
    final TreeItem<TableCarMain> nodeAuto = new TreeItem<>(new TableCarMain("AutomaticCar")); 
    final TreeItem<TableCarMain> nodeManual = new TreeItem<>(new TableCarMain("ManualCar")); 


//Child Nodes - Getting data from Excel & creating the child nodes 
for (List<XSSFCell> line : filteredData) { 
     if (line.get(3).getStringCellValue().equals("AutomaticCar")) { 
nodeAuto.getChildren().add(new TreeItem<>(new TableCarMain(line.get(0).getStringCellValue()))); 
     } 
     if (line.get(3).getStringCellValue().equals("ManualCar")) { 
      nodeManual.getChildren().add(new TreeItem<>(new TableCarMain(line.get(0).getStringCellValue()))); 
     } 
} 

root.setExpanded(true); 
    root.getChildren().addAll(nodeAuto , nodeManual); 
tvTree.setRoot(root); 

Для целей тестирования я добавил кнопку в FXML, связала ниже код к & добавлен генератор случайных чисел имитировать данные в реальном времени, которые я ожидаю получить. Идея заключается в том, что я нажимаю кнопку запуска, так как случайный номер генерирует значения, значение в столбце «Последние» должно показывать значение. Пока я не проходя никакого значения столбцам High & низко, как это не работает Последние

@FXML 
FloatProperty latestProperty= new SimpleFloatProperty(); 
FloatProperty externalDataProperty= new SimpleFloatProperty(); 
private void getData() { 
    latestProperty.bind(externalDataProperty); 

    ObservableList<TableTradeMain> lineData = FXCollections.observableArrayList(); 

    for (List<XSSFCell> line : filteredData) { 
     lineData.add(new TableCarMain(line.get(0).getStringCellValue(), Float.toString(latestProperty.get()))); 
    } 

    Random randomGenerator = new Random(); 
    for (int idx = 1; idx <= 10; ++idx) { 
     externalDataProperty.set(randomGenerator.nextFloat()); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     } 
} 
+0

Вы блоки кода ('сон()' s) на FX Application Thread, поэтому вы не увидите никаких обновлений пользовательского интерфейса до тех пор, пока цикл не будет завершен. Другими словами, это заставит ваш пользовательский интерфейс замерзнуть в течение 10 секунд, а затем отобразит последнее значение, генерируемое в цикле. Вам нужно переместить этот код в фоновый поток. –

+0

@James_D Я прокомментировал часть сна, поскольку это не требуется, но все же нет вывода в столбце, озаглавленном последним. Я предполагаю, что ошибаюсь в том, как я заполняю TreeTableView, неспособный понять его. – iCoder

+1

Ну ... вы обновляете значения чего-либо в дереве? Просто похоже, что вы каждый раз обновляете 'externalDataProperty', который будет обновлять' latestProperty', но не будет обновлять какие-либо свойства в каких-либо экземплярах 'TableCarMain'. Вам необходимо обновить свойства объектов модели, отображаемых в переменной. –

ответ

0

Решенный эту проблему с помощью ListProperty

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