2017-01-02 3 views
1

Ich möchte alle ausgewählten Werte in TreeView mit CheckBoxTreeItem s erhalten.JavaFX: Holen Sie den ausgewählten Wert, wenn CheckBoxTreeItem geklickt

Wie wird das erreicht?

enter image description here

+1

Bitte [Bearbeiten] Ihre Frage ein schließen [MCVE] erzeugt einen Baum wie den von Ihnen geposteten. Wie Sie die ausgewählten Elemente erhalten, hängt davon ab, wie Sie Ihre Baum- und Baumelemente eingerichtet haben, und hängt möglicherweise von bestimmten Methoden in Ihrer Modellklasse ab. –

Antwort

4

Sie können auf der Wurzel zu den Ereignissen hören einen Set<TreeItem> auf dem neuesten Stand zu halten oder Sie können ein DFS für ausgewählte Objekte erstellen, die am Stamm beginnen.

Beachten Sie, dass der DFS-Ansatz sicherlich die kleinere Menge an Code benötigt, aber der andere Ansatz ermöglicht es Ihnen, während Modifikationen der Einrichtung auf dem neuesten Stand zu halten ...

@Override 
public void start(Stage primaryStage) { 
    CheckBoxTreeItem<String> root = new CheckBoxTreeItem<>("root"); 
    CheckBoxTreeItem<String> c1 = new CheckBoxTreeItem<>("c1"); 
    c1.getChildren().addAll(
      new CheckBoxTreeItem<>("c1.1"), 
      new CheckBoxTreeItem<>("c1.2"), 
      new CheckBoxTreeItem<>("c1.3") 
    ); 
    CheckBoxTreeItem<String> c2 = new CheckBoxTreeItem<>("c2"); 
    c2.getChildren().addAll(
      new CheckBoxTreeItem<>("c2.1"), 
      new CheckBoxTreeItem<>("c2.2"), 
      new CheckBoxTreeItem<>("c2.3") 
    ); 
    CheckBoxTreeItem<String> c3 = new CheckBoxTreeItem<>("c3"); 
    c3.getChildren().addAll(
      new CheckBoxTreeItem<>("c3.1"), 
      new CheckBoxTreeItem<>("c3.2"), 
      new CheckBoxTreeItem<>("c3.3") 
    ); 
    root.getChildren().addAll(c1, c2, c3); 

    TreeView<String> treeView = new TreeView<>(root); 
    treeView.setCellFactory(CheckBoxTreeCell.forTreeView()); 
    Set<TreeItem<String>> selected = new HashSet<>(); 

    // listen for selection change 
    root.addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), (CheckBoxTreeItem.TreeModificationEvent<String> evt) -> { 
     CheckBoxTreeItem<String> item = evt.getTreeItem(); 

     if (evt.wasIndeterminateChanged()) { 
      if (item.isIndeterminate()) { 
       selected.remove(item); 
      } else if (item.isSelected()) { 
       selected.add(item); 
      } 
     } else if (evt.wasSelectionChanged()) { 
      if (item.isSelected()) { 
       selected.add(item); 
      } else { 
       selected.remove(item); 
      } 
     } 
    }); 

    // listen for subtree add/remove 
    root.addEventHandler(TreeItem.childrenModificationEvent(), (TreeItem.TreeModificationEvent<String> evt) -> { 
     if (evt.wasAdded()) { 
      for (TreeItem<String> added : evt.getAddedChildren()) { 
       addSubtree(selected, (CheckBoxTreeItem<String>) added); 
      } 
     } 
     if (evt.wasRemoved()) { 
      for (TreeItem<String> removed : evt.getRemovedChildren()) { 
       removeSubtree(selected, (CheckBoxTreeItem<String>) removed); 
      } 
     } 
    }); 

    Button button = new Button("print selected"); 
    button.setOnAction(evt -> { 
     System.out.println("----------------"); 
     selected.stream().map(TreeItem::getValue).forEach(System.out::println); 
    }); 

    Button button2 = new Button("print dfs"); 
    button2.setOnAction(evt -> { 
     System.out.println("----------------"); 
     print(root); 
    }); 

    Button remove = new Button("remove"); 
    remove.setOnAction(evt -> { 
     root.getChildren().remove(c3); 
    }); 

    Scene scene = new Scene(new VBox(treeView, button, button2, remove)); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

private static <T> void removeSubtree(Collection<TreeItem<T>> collection, CheckBoxTreeItem<T> item) { 
    if (item.isSelected()) { 
     collection.remove(item); 
    } else if (!item.isIndeterminate() && !item.isIndependent()) { 
     return; 
    } 
    for (TreeItem<T> child : item.getChildren()) { 
     removeSubtree(collection, (CheckBoxTreeItem<T>) child); 
    } 
} 

private static <T> void addSubtree(Collection<TreeItem<T>> collection, CheckBoxTreeItem<T> item) { 
    if (item.isSelected()) { 
     collection.add(item); 
    } else if (!item.isIndeterminate() && !item.isIndependent()) { 
     return; 
    } 
    for (TreeItem<T> child : item.getChildren()) { 
     addSubtree(collection, (CheckBoxTreeItem<T>) child); 
    } 
} 

private static <T> void print(CheckBoxTreeItem<T> item) { 
    if (item.isSelected()) { 
     System.out.println(item.getValue()); 
    } else if (!item.isIndeterminate() && !item.isIndependent()) { 
     return; 
    } 
    for (TreeItem<T> child : item.getChildren()) { 
     print((CheckBoxTreeItem<T>) child); 
    } 
} 
+0

Danke @fabian Befehle, um richtig zu arbeiten –

1

Wenn Sie eine TreeView verwenden, können Sie das Element wie folgt gewählt erhalten:

treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<TreeItem<String>>() { 

     @Override 
     public void changed(ObservableValue<? extends TreeItem<String>> observable, TreeItem<String> oldValue, 
       TreeItem<String> newValue) { 

      System.out.println("The selected item is : "newValue.getValue()); 


     } 
}); 
+1

Es sollte beachtet werden, dass der Ansatz den Index einer ausgewählten Zelle und nicht die Werte des ausgewählten CheckBoxTreeItems ausgibt. – fabian

+0

Aktualisiert, danke für Ihre Aufmerksamkeit, und ich denke, er wird nicht die erste brauchen, also lösche ich es! ! :) –

Verwandte Themen