有没有办法从JavaFX TreeView获取Item节点作为列表?
TreeView<String> treeView = new TreeView<>(treeItemRoot);
例如,我想将组件放入HashMap。
答案 0 :(得分:1)
这是一种可能的方式。我创建了一个自定义对象,而不是使用String,您可以在其中保存一些属性。我设置它是否是标题和标题。然后我浏览节点,如果它不是标题,我将它们添加到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);
}
}