2017-06-15 93 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);     
       } 

      }); 

     } 
相关问题