2014-06-20 84 views

回答

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); 
} 

}