2017-05-20 6 views
3

TextFieldにテキストを入力してEnterキーを押すと、TreeViewでその文字列の最初のインスタンスが見つかるように検索機能を設定したいと思います。もう一度Enterキーを押すと、2番目のインスタンスが見つかるでしょう。もう一度押すと、3番目のインスタンスが見つかります。次のTreeItemのJavaFX TreeViewを検索するには?

TreeViewを検索して最初のTreeItemを見つけることは難しくありません。そのテキストを含む他のTreeItemのTreeViewを検索し続ける方法が不明です。ツリービュー内のすべてのフォルダ/ドキュメントを検索すると、何らかの再帰関数が必要になると思いますが、わかりません。したがって、誰かがこの検索機能を作成する方法の例やヒントを提供できるかどうか尋ねたいと思います。任意の助けいただければ幸い:)

ドリュー

答えて

0

あなたは可能性があり、ツリーを検索するrecurive機能を。

以下のコードでは、searchBtnがクリックされたインスタンス変数を1つ保持していますが、次の一致を取得してもユーザーが再度検索ボタンをクリックすると、 、それは最初から(前回のマッチではないから)ツリーを横断、あなたは今のためのソリューションとしてこれを使用することができ、私はそれを

public class TreeViewSample extends Application { 

private int count=0; 

private TreeView<String> tree; 
public static void main(String[] args) { 
    launch(args); 
} 

@Override 
public void start(Stage primaryStage) { 
    primaryStage.setTitle("Tree View Sample");   


    TextField txtField=new TextField(); 
    Button searchBtn=new Button("Search"); 

    txtField.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent arg0) { 
      count=0; 
     } 
    }); 
    TreeItem<String> rootItem = new TreeItem<String> ("Root"); 
    rootItem.setExpanded(true); 

    TreeItem<String> item1 = new TreeItem<String> ("Child 1"); 
    TreeItem<String> item12 = new TreeItem<String> ("Child 12"); 
    item1.getChildren().add(item12); 
    TreeItem<String> item2 = new TreeItem<String> ("Child 2"); 
    TreeItem<String> item21 = new TreeItem<String> ("Child 21"); 
    item2.getChildren().add(item21); 
    TreeItem<String> item211 = new TreeItem<String> ("Child 12"); 
    item21.getChildren().add(item211); 
    TreeItem<String> item3 = new TreeItem<String> ("Child 3"); 
    TreeItem<String> item31 = new TreeItem<String> ("Child 12"); 
    item3.getChildren().add(item31); 
    rootItem.getChildren().addAll(item1,item2,item3); 
    searchBtn.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent arg0) { 
      count++; 
      handleSearch(rootItem,txtField.getText()); 

     } 
    }); 
    this.tree = new TreeView<String> (rootItem);  

    VBox root = new VBox(); 
    root.getChildren().addAll(tree,txtField,searchBtn); 
    primaryStage.setScene(new Scene(root, 300, 250)); 
    primaryStage.show(); 
} 

protected int handleSearch(TreeItem<String> rootItem, String text) { 
    int count=0; 
    if(rootItem!=null&&rootItem.getValue().equals(text)){ 
     tree.getSelectionModel().select(rootItem); 
     return 1; 
    } 
    if(rootItem!=null&&!rootItem.getChildren().isEmpty()){ 
     for(TreeItem<String> treeItem: rootItem.getChildren()){ 
      count+=handleSearch(treeItem, text); 
      if(this.count==count){ 
       break; 
      } 
     } 
    } 
    return count; 
} 
} 

注平均時間でより最適な解決策を考え出すしようとします再帰を使用したくない場合は、ツリーイテレータを使用してループ内で反復処理することもできます。

+0

Heyオズワルド、お返事ありがとうございます!これは興味深いアプローチですが、残念なことに、ほとんどの場合正確にカウント変数をインクリメントしませんし、ツリーの終わりに達すると開始までループしません。 –

+0

@DrewB自分のコードがうまく書かれていないことを理解していますが、あなたのニーズに合わせて再帰関数のアプローチを拡張できるかもしれません:) – Oswald

+1

私はこれを使って自分のニーズに合ったものを書くことができました。努力していただきありがとうございます:) –

関連する問題