(Java) javafx не отображаются данные в treeTableView
У меня есть элемент treeTableView в котором я хочу отобразить дерево из элементов типа String.
Для этого я создаю treeTableView через javafx (через файл с параметрами в main.fxml) и дальше хочу заполнить это дерево данными.
Для этого использую такой код:
public void init(){
//Получить treeTableViewFileName
TreeTableView<String> treeTableViewFileName = controller.getTreeTableViewFileName();
//Creating tree items
TreeItem<String> childNode1 = new TreeItem<>("Child Node 1");
TreeItem<String> childNode2 = new TreeItem<>("Child Node 2");
TreeItem<String> childNode3 = new TreeItem<>("Child Node 3");
//Creating the root element
TreeItem<String> root = new TreeItem<>("Root");
root.setExpanded(true);
//Adding tree items to the root
root.getChildren().setAll(childNode1, childNode2, childNode3);
//В колонку добавить CellValueFactory
TreeTableColumn<String, String> column1 = controller.getTreeColumnFileName();
column1.setCellValueFactory(new TreeItemPropertyValueFactory<>("name"));
treeTableViewFileName.setRoot(root); //Добавить root
treeTableViewFileName.setShowRoot(true); //Разрешить отображение root
//Запретить возможность менять размер колонки
column1.setResizable(false);
//Запретить возможность сортировать значения в колонке
column1.setSortable(false);
System.out.println("stop");
}
При этом получается, что таблица создается, но ничего не отображается:
При этом на разных других сайтах видел примеры, когда происходит создание treeTableView на основе root элемента, вот таким образом:
TreeTableView<String> treeTableView = new TreeTableView<>(root);
Мне такое не подходит, потому что создание идет через файл main.fxml, а сами данные мне необходимо добавлять по мере работы программы. Во всех примерах, что я видел был именно такой подход: создание таблицы на основе root.
Часть кода из main.fxml:
<Pane fx:id="pane3" prefHeight="280.0" prefWidth="917.0">
<children>
<TreeTableView fx:id="treeTableViewFileName" layoutX="14.0" layoutY="16.0" prefHeight="240.0" prefWidth="227.0">
<columns>
<TreeTableColumn fx:id="treeColumnFileName" prefWidth="199.0" text="FileName" />
</columns>
</TreeTableView>
</children>
</Pane>
Подскажите как можно организовать отображение данных в моем случае? Заранее спасибо большое.
Ответы (1 шт):
Нашел такое решение: можно попробовать сделать дополнительный класс, например назвав его Employee или как угодно, он нужен, чтобы отображать данные в строках таблицы.
Этот класс будет выглядеть так:
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
public class Employee {
private final ObjectProperty<String> name;
public Employee (String name) {
this.name = new SimpleObjectProperty<>();
this.name.set(name);
}
public final ObjectProperty<String> nameProperty() {
return this.name;
}
}
Затем нужно выполнить 2 стадии: 1) инициализация и 2) ввод данных.
Стадия 1:
//Получить treeTableViewFileName
TreeTableView<Employee> treeTableViewFileName = controller.getTreeTableViewFileName();
//В колонку добавить TreeItemPropertyValueFactory
TreeTableColumn<Employee, String> column1 = (TreeTableColumn) treeTableViewFileName.getColumns().get(0);
column1.setCellValueFactory(new TreeItemPropertyValueFactory<Employee, String ("name"));
//Разрешить отображение root
treeTableViewFileName.setShowRoot(true);
Стадия 2:
//Создать root элемент
Employee rootEmp = new Employee("root");
//Создать элементы child
Employee emp1 = new Employee("asdadsa");
Employee emp2 = new Employee("asdadsa");
Employee emp3 = new Employee("asdadsa");
TreeItem<Employee> childNode1 = new TreeItem<>(emp1);
TreeItem<Employee> childNode2 = new TreeItem<>(emp2);
TreeItem<Employee> childNode3 = new TreeItem<>(emp3);
TreeItem<Employee> root = new TreeItem<>(rootEmp);
root.setExpanded(true);
root.getChildren().setAll(childNode1, childNode2, childNode3);
//Так как я произвожу данные действия в другом потоке, то нужно сделать обновление в потоке javafx
Platform.runLater(() -> {
treeTableViewFileName.setRoot(root); //Добавить root и данные
});
Основная часть из main.fxml:
<Pane fx:id="pane3" prefHeight="280.0" prefWidth="917.0">
<children>
<TreeTableView fx:id="treeTableViewFileName" layoutX="14.0" layoutY="16.0" prefHeight="240.0" prefWidth="227.0">
<columns>
<TreeTableColumn fx:id="treeColumnFileName" prefWidth="199.0" text="FileName" />
</columns>
</TreeTableView>
</children>
</Pane>
Мой контроллер Controller_MainGUI:
public class Controller_MainGUI {
@FXML
private TreeTableView treeTableViewFileName;
@FXML
private TreeTableColumn treeColumnFileName;
public TreeTableView getTreeTableViewFileName(){
return this.treeTableViewFileName;
}
public TreeTableColumn getTreeColumnFileName(){
return this.treeColumnFileName;
}
}
И там самым на выходе мы получаем:

