2017-06-15 88 views
0

您好我正在處理與javafx中的treeView相關的應用程序,我在[1]之前問過這個問題:JavaFx: How to Use existing branch with leafs as a newly add branch,但沒有得到任何答案。我試圖自己,併到達這裏JavaFx:使用現有的分支作爲新添加的分支

public class Main extends Application 
{ 
    private static TreeItem<String> item2; 
    @SuppressWarnings("unchecked") 
    @Override 
    public void start(Stage primaryStage) 
    { 
     BorderPane border = new BorderPane();  
     Scene scene = new Scene(border,300,300); 
     primaryStage.setTitle("BorderPane"); 
     primaryStage.setScene(scene); 
     primaryStage.show();  

     TreeItem<String> tree = new TreeItem<String>("Root"); 
     item2 = new TreeItem<String>("poles"); 
     TreeItem<String> item2Child1 = new TreeItem<String>("X"); 
     TreeItem<String> item2Child2 = new TreeItem<String>("Y"); 
     item2.getChildren().addAll(item2Child1,item2Child2);   
     //item2.setExpanded(true);  
     tree.setExpanded(true); 
     tree.getChildren().addAll(item2); 
     TreeView<String> treeView = new TreeView<String>(tree);  
     treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){ 
      @Override 
      public TreeCell<String> call(TreeView<String> p) { 
       return new AddMenuTreeCell(); 
      } 
     });   
     border.setCenter(treeView); 
    }  
    private static class AddMenuTreeCell extends TextFieldTreeCell<String> { 
     private ContextMenu menu = new ContextMenu(); 
     private TextField textField; 

     public AddMenuTreeCell() { 
      MenuItem item1 = new MenuItem("Insert poles");    
      menu.getItems().add(item1); 
      item1.setOnAction(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent arg0) {    
           getTreeItem().getChildren().add(item2);        
       } 
      });    
     } 
     @Override 
     public void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 
      if (empty) { 
       setText(null); 
       setGraphic(null); 
      } else { 
       if (isEditing()) { 
        if (textField != null) { 
         textField.setText(getString()); 
        } 
        setText(null); 
        setGraphic(textField); 
       } else { 
        setText(getString()); 
        setGraphic(getTreeItem().getGraphic()); 
        if (!(getTreeItem().isLeaf() && getTreeItem().getParent() == null)){ 
         setContextMenu(menu); 
        } 
       }   
      } 
     } 
     private String getString() { 
      return getItem() == null ? "" : getItem().toString(); 
     } 
    } 
} 

與此用戶可以添加現有的分支「杆」。但問題是,用戶無法在任何極點分支中添加Poles。

[應用工作這樣的用戶必須使用現有的分支「極點」作爲新加入的分支,並可以添加儘可能多極,因爲他想要的任何分支內。]

什麼好主意會有所幫助請。

謝謝

+0

什麼是條件'if(!(空&& getTreeItem()。getParent()== null))'應該是?如果'empty'爲true,那麼'getTreeItem()。getParent()'會拋出一個空指針異常。而且,你已經將「else」塊封裝爲「if(empty)」,所以你知道'empty'是錯誤的......你在那裏意味着什麼? –

+0

@James_D這是要獲得右擊滾動「添加極點」超過根和分支(極點)。 – Mudasir

+0

那顯然不是它所做的,但?你能解決這個邏輯嗎?我不明白你爲什麼需要一個「if」。 –

回答

1

根據需要,新添加的分支在添加時應該有它自己的葉子。使用現有分支來解決這個問題是錯誤的。添加新分支時應該使用

private static class AddMenuTreeCell extends TextFieldTreeCell<String> { 
     private ContextMenu menu = new ContextMenu(); 
     private TextField textField; 
     // private TreeItem<String> newBranch; 
     public AddMenuTreeCell() { 

      MenuItem renameItem1 = new MenuItem("Insert Unite"); 

      menu.getItems().add(renameItem1); 
      renameItem1.setOnAction(new EventHandler<ActionEvent>() { 

       @Override 
       public void handle(ActionEvent arg0) {      
        TreeItem<String> item3 = new TreeItem<String>("poles"); 
        item3.getChildren().addAll(new TreeItem<>("x"),new TreeItem<>("y")); 
          getTreeItem().getChildren().add(item3);     
       } 

      }); 

     } 
相關問題