JavaFx TreeTableView实时数据

JavaFx TreeTableView实时数据,javafx,javafx-8,treetableview,Javafx,Javafx 8,Treetableview,问题-无法在TreeTableView中填充实时数据。数据来自外部源&需要实时显示在TreeTableView中 下面是代码的简明部分。我能够创建带有节点的树表视图。为了进行测试,我创建了一个随机数生成器&将其与表树视图字段绑定。不确定这是否是正确的方法 希望我能把这个问题解释清楚。期待指导 FXML: <TreeTableColumn fx:id="car" prefWidth="150.0" text="Car" /> <T

问题-无法在TreeTableView中填充实时数据。数据来自外部源&需要实时显示在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);

控制器:

 <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);
public void初始化(URL位置,ResourceBundle资源){
//初始化表视图
setCellValueFactory((CellDataFeatures p)->新的ReadOnlyStringWrapper(
p、 getValue().getValue().getCar());
最新的.setCellValueFactory((CellDataFeatures p)->新的ReadOnlyStringWrapper(
p、 getValue().getValue().getLatest());
high.setCellValueFactory((CellDataFeatures p)->新的ReadOnlyStringWrapper(
p、 getValue().getValue().getHigh());
low.setCellValueFactory((CellDataFeatures p)->新的ReadOnlyStringWrapper(
p、 getValue().getValue().getLow());
//创建主节点
最终树项根=新树项(新表项(“车辆”);
最终TreeItem nodeAuto=新TreeItem(新表格CARMain(“AutomaticCar”);
最终TreeItem nodeManual=新TreeItem(新表CARMAIN(“手动汽车”));
//子节点-从Excel获取数据并创建子节点
用于(列表行:Filteredata){
if(line.get(3.getStringCellValue().equals(“AutomaticCar”)){
nodeAuto.getChildren().add(新的TreeItem(新的TableCarMain)(line.get(0.getStringCellValue()));
}
如果(line.get(3).getStringCellValue()等于(“手动汽车”)){
nodeManual.getChildren().add(新的TreeItem(新的TableCarMain)(line.get(0.getStringCellValue()));
}
}
root.setExpanded(true);
root.getChildren().addAll(nodeAuto,nodeManual);
tvTree.setRoot(根);
出于测试目的,我在FXML中添加了一个按钮,将下面的代码链接到它,并添加了一个随机数生成器来模拟我期望得到的实时数据。这个想法是在我按下开始按钮后,当随机数生成值时,最新列中的值应该显示该值。目前我没有向colum传递任何值ns高和低,因为它不适用于最新版本

@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();
        }
        }
}
@FXML
FloatProperty latestProperty=新的SimpleFloatProperty();
FloatProperty externalDataProperty=新的SimpleFloatProperty();
私有void getData(){
latestProperty.bind(externalDataProperty);
ObservableList lineData=FXCollections.observableArrayList();
用于(列表行:Filteredata){
添加(新的TableCarMain(line.get(0.getStringCellValue(),Float.toString(latestProperty.get())));
}
Random randomGenerator=新的Random();

for(int idx=1;idx通过使用ListProperty代码块(
sleep()
s)解决了此问题在FX应用程序线程上,因此在循环完成之前,您不会看到任何UI更新。换句话说,这将导致您的UI冻结10秒,然后显示循环中生成的最后一个值。您需要将该代码移动到后台线程。@James_D我已注释掉睡眠部分,因为它不是必需的,但在中仍然没有输出标题为latest的专栏。我想我在填充TreeTableView的方式上犯了一些错误,无法将其计算出来……您是否正在更新树中任何内容的值?看起来您每次都在更新
externalDataProperty
,这将更新
latestProperty
,但不会更新任何属性在任何
表格CARMAIN
实例中都有。您需要更新树表中显示的模型对象的属性。@James\u D是的,我需要用值填充树。树中的第一列将第一次填充&另一列中的值需要用流动的实时数据填充。目前是ting&因此,仅检查该方法是否能够在数据发生变化时用数据填充1列。希望很清楚。我认为您没有领会我的观点。如果您的代码不更新树表中显示的值,您将不会看到任何结果。