2017-05-15 10 views
1

ここに私の例は編集可能な秋の木です。ツリー内の特定の項目が選択されている場合にメソッドを実行する方法は?

public class Main extends Application 
{ 
    private BorderPane border; 
    TreeItem<String> tree; 
    TreeView<String> treeView; 
    @Override 
    public void start(Stage primaryStage) 
    { 
     border = new BorderPane();  
     Scene scene = new Scene(border,750,500);   
     primaryStage.setTitle("BorderPane"); 
     primaryStage.setScene(scene); 
     primaryStage.show();  

     tree = new TreeItem<String>("Library"); 

     TreeItem<String> item1 = new TreeItem<String>("Module"); 
     TreeItem<String> item1Child = new TreeItem<String>("MX"); 
     item1.getChildren().add(item1Child); 

     TreeItem<String> item2 = new TreeItem<String>("Unite"); 
     TreeItem<String> item2Child = new TreeItem<String>("UX"); 
     item2.getChildren().add(item2Child);   
     item2.setExpanded(true);   
     TreeItem<String> item3 = new TreeItem<String>("Translate"); 
     TreeItem<String> item3Child = new TreeItem<String>("TX"); 
     item3.getChildren().add(item3Child); 

     TreeItem<String> item4 = new TreeItem<String>("Rotate"); 
     TreeItem<String> item4Child = new TreeItem<String>("Rx"); 
     item4.getChildren().add(item4Child); 

     tree.setExpanded(true); 
     tree.getChildren().addAll(item1,item2,item3,item4); 
     treeView = new TreeView<String>(tree); 
     treeView.setEditable(true); 
     treeView.setCellFactory(TextFieldTreeCell.forTreeView()); 




      VBox vbox =new VBox(2); 
      vbox.setPadding(new Insets(5)); 
      VBox.setVgrow(treeView, Priority.ALWAYS); 
      vbox.getChildren().addAll(new Text("Fall Tree"),treeView); 

      HBox hb = new HBox(); 
      VBox rightPane = getrightPane(); 
      hb.setSpacing(20); 
      hb.getChildren().addAll(vbox,rightPane); 

      border.setCenter(hb); 

     } 

     private VBox getrightPane() { 
      VBox vb = new VBox(30); 
      vb.setPadding(new Insets(10)); 
      HBox h1 = new HBox(7); 
      h1.getChildren().addAll(new Label("X:"), new TextField()); 

      HBox box = new HBox(20); 
      Rectangle rect1 = new Rectangle(150,150); 
      rect1.setFill(null); 
      rect1.setStroke(Color.BLACK); 
      box.getChildren().addAll(rect1); 
      box.setAlignment(Pos.BOTTOM_CENTER); 
      vb.getChildren().addAll(h1,box);   
      return vb; 
     } 

     /** 
     * @param args the command line arguments 
     */ 
     public static void main(String[] args) 
     { 
      launch(args); 
     } 

コメントセクションで見ることができるように、リスナーが適用されますが、枝と葉のテキストの唯一のチェックテキストです。

私の質問は、getrightPane()全体を唯一のリーフにリスナーとして割り当てる方法です(例としてMXとしましょう)。適用されると、他のリーフはgetrightPane()を表示すべきではありません。

選択されたリーフ/ブランチの1つにのみリスナーとしてgetrightPane()を割り当ててください。

ありがとうございます。

+0

を試してみてください。 "私の質問は、getrightPane()全体をリスナーとして、唯一のリーフに割り当てる方法です(例としてMXとします)。適用すると、他のリーフはgetrightPane()を表示しません。 'getRightPane()'はメソッドであり、リスナーではありません。ツリー内の特定の項目が選択されている場合にのみ、そのメソッドを実行したいと言っていますか?もしそうなら、単にあなたが持っているリスナーに 'if'文を置くのはなぜですか? –

+0

@James_Dはい、特定の項目が選択されている場合、そのメソッドを実行します。私はこの
\t \t \tとしようとした場合(selectedItem.getChildren()のisEmpty()){
\t \t \t \t \tのSystem.out.println( "そのmehtod")。他
\t \t \t}
\t \t \t \t {
\t \t \tのSystem.out.println( "そのカテゴリー")。
\t \t \t}
\t \t \t}
\t \t \t \t \t})。
Mudasir

+0

何が起こったのですか? –

答えて

2

は、それはあなたが求めているものを本当にはっきりしていないこの

VBox rightPane = new VBox(); 

    treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() { 
       @Override 
       public void changed(ObservableValue observable, Object oldValue, Object newValue) { 

        if (newValue == item1Child) {       
         rightPane.getChildren().add(getrightPane()); 
        } else { 
         int i = rightPane.getChildren().size();       
         if (i > 0) { 
          rightPane.getChildren().remove(0); 
         } 

        } 
       } 
      }); 
1

次の例のように、やるだけのことができるようになります。

treeView.getSelectionModel().selectedItemProperty().addListener((obs, oldItem, newItem) -> { 

    if (newItem == item1Child) { 
     System.out.println("MX selected"); 
     // do whatever you need here.... 
    } 

}); 
+0

ありがとうございます。どのように私はこのように変更する - >ユーザーが選択したとき(MXと言う)メソッドgetrightPane()は木のすぐ隣で実行する必要があります。他の項目が選択されている場合は、出力時にメソッド(ツリーのみ)は表示されません。これは私が望む方法です、私はそのような使用方法を混同しています。 – Mudasir

+0

ありがとうございました。 – Mudasir

+0

@ Keyur Bhanderiありがとうございました。 – Mudasir

関連する問題