#javafx #javafx-2 #javafx-8
#javafx #javafx-2 #javafx-8
Вопрос:
Есть ли способ получить узлы элементов в виде списка из JavaFX TreeView?
TreeView<String> treeView = new TreeView<>(treeItemRoot);
Например, я хотел бы получить компоненты в HashMap.
Ответ №1:
Вот один из возможных способов. Вместо использования строки я создал пользовательский объект, в котором вы можете хранить некоторые свойства. Я установил, был ли это заголовок или нет, и заголовок. Затем я просматриваю узлы, и если это не заголовок, я добавляю их в HashMap. Вы можете добавить элементы заголовка на карту или что угодно.
Код
package application;
import java.util.HashMap;
import java.util.Map;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class Main extends Application {
Map<String, MyNode> map = new HashMap<String, MyNode>();
@Override
public void start(Stage stage) {
try {
BorderPane border = new BorderPane();
Scene scene = new Scene(border);
stage.setWidth(500);
stage.setHeight(400);
TreeItem<MyNode> rootItem = new TreeItem<MyNode>();
rootItem.setExpanded(true);
rootItem.setValue(new MyNode("Top Header", true));
//Subtree 1
TreeItem<MyNode> subTree1Item = new TreeItem<MyNode>();
subTree1Item.setExpanded(true);
subTree1Item.setValue(new MyNode("Subtree 1", true));
rootItem.getChildren().add(subTree1Item);
for (int i = 1; i < 6; i ) {
TreeItem<MyNode> item = new TreeItem<MyNode>();
item.setValue(new MyNode("Subtree 1 Item " i, false));
subTree1Item.getChildren().add(item);
}
//Subtree 2
TreeItem<MyNode> subTree2Item = new TreeItem<MyNode>();
subTree2Item.setExpanded(true);
subTree2Item.setValue(new MyNode("Subtree 2", true));
rootItem.getChildren().add(subTree2Item);
for (int i = 1; i < 6; i ) {
TreeItem<MyNode> item = new TreeItem<MyNode>();
item.setValue(new MyNode("Subtree 2 Item " i, false));
subTree2Item.getChildren().add(item);
}
TreeView<MyNode> tree = new TreeView<MyNode>(rootItem);
//Populate map with leaf nodes
populateMap(rootItem);
//Print map
for(MyNode node : map.values()){
System.out.println(node.getTitle());
}
border.setCenter(tree);
stage.setScene(scene);
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
private void populateMap(TreeItem<MyNode> item){
if(item.getChildren().size() > 0){
for(TreeItem<MyNode> subItem : item.getChildren()){
populateMap(subItem);
}
}
else {
MyNode node = (MyNode) item.getValue();
if(!node.isHeader()){
map.put(node.getTitle(), node);
}
}
}
private class MyNode {
boolean header;
String title;
public MyNode(String title, boolean header){
this.title = title;
this.header = header;
}
public boolean isHeader() {
return header;
}
public void setHeader(boolean header) {
this.header = header;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String toString(){
return title;
}
}
public static void main(String[] args) {
launch(args);
}
}