2015-05-01 3 views
1

Я пытаюсь выбрать все дочерние флажки из родительского корня. Действие вызывается при выборе родительского флажка.CheckBoxTreeTableCell Выбрать всех детей под родительским событием

Вот псевдо/модифицированный/укороченный набор с scenebuilder:

@FXML 
private TreeTableView<Info> testTable; 
@FXML 
private TreeTableColumn<Info, Boolean> checkBoxCol; 

Модель:

public class Info{ 
    private final BooleanProperty onHold; 

    public Info(){ 
     this.onHold = new SimpleBooleanProperty(false); 
    } 
    public Boolean getOnHold(){ 
     return onHold.get(); 
    } 
    public void setOnHold(Boolean onHold) { 
     this.onHold.set(onHold); 
    } 
    public BooleanProperty onHoldProperty(){ 
     return onHold; 
    } 
} 

Контроллер:

checkBoxCol.setCellValueFactory(new TreeItemPropertyValueFactory("onHold")); 
    checkBoxCol.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(checkBoxCol)); 

Конечный результат будет выглядеть следующим образом (когда родительский узлы):

enter image description here

Я попробовал onEditCommit/start/cancel, но похоже, что это касается только ячейки, а не флажков. Я не совсем уверен, как получить слушателя только для родительских узлов, чтобы он мог проверять все значения под ними (если у них есть дети). Если слишком сложно разрешить только родительским узлам иметь слушателя, тогда у всех флажков могут быть слушатели, и я могу просто проверить, есть ли дети с: node.getChildren().size()

+0

Если вы хотите прикрепить слушателя к CheckBox затем идти в класс, который представляет этот флажок и посмотреть на его методы. Там вы найдете метод только для этого. –

ответ

1

Вы должны иметь возможность полностью управлять ими в модели ,

TreeTableView состоит из корень TreeItem<Info> с кучей нисходящих узлов. Просто договоритесь, что каждый раз, когда вы создаете элементы дерева, необходимо добавить прослушиватель к свойствам:

private TreeItem<Info> createTreeItem(Info info) { 
    TreeItem<Info> item = new TreeItem<>(info); 
    info.onHoldProperty().addListener((obs, wasOnHold, isNowOnHold) -> { 
     if (isNowOnHold) { 
      item.getChildren().forEach(child -> child.getValue().setOnHold(true)); 
     } 
    }); 
    return item ; 
} 

Полный пример:

import javafx.application.Application; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.scene.Scene; 
import javafx.scene.control.TreeItem; 
import javafx.scene.control.TreeTableColumn; 
import javafx.scene.control.TreeTableView; 
import javafx.scene.control.cell.CheckBoxTreeTableCell; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class TreeTableViewInheritableCheckBoxes extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     TreeTableView<Info> table = new TreeTableView<>(); 
     table.setEditable(true); 

     TreeTableColumn<Info, Boolean> infoCol = new TreeTableColumn<>("Info"); 
     infoCol.setPrefWidth(200); 

     infoCol.setCellValueFactory(cellData -> cellData.getValue().getValue().onHoldProperty()); 
     infoCol.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(infoCol)); 
     table.getColumns().add(infoCol); 

     TreeItem<Info> root = createTreeItem(new Info()); 

     buildTree(root, 0); 

     table.setRoot(root); 

     primaryStage.setScene(new Scene(new BorderPane(table), 250, 400)); 
     primaryStage.show(); 
    } 

    private void buildTree(TreeItem<Info> parent, int depth) { 
     if (depth > 2) return ; 
     for (int i = 0; i < 5; i++) { 
      TreeItem<Info> item = createTreeItem(new Info()); 
      parent.getChildren().add(item); 
      buildTree(item, depth + 1); 
     } 
    } 

    private TreeItem<Info> createTreeItem(Info info) { 
     TreeItem<Info> item = new TreeItem<>(info); 
     info.onHoldProperty().addListener((obs, wasOnHold, isNowOnHold) -> { 
      if (isNowOnHold) { 
       item.getChildren().forEach(child -> child.getValue().setOnHold(true)); 
      } 
     }); 
     return item ; 
    } 

    public static class Info { 
     private final BooleanProperty onHold; 

     public Info(){ 
      this.onHold = new SimpleBooleanProperty(false); 
     } 
     public Boolean getOnHold(){ 
      return onHold.get(); 
     } 
     public void setOnHold(Boolean onHold) { 
      this.onHold.set(onHold); 
     } 
     public BooleanProperty onHoldProperty(){ 
      return onHold; 
     } 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

Ты сир, как фанатик-фанатик javafx в stackoverflow. Вы спасете нас от аспирина и дополнительного кофеина! :] – AnotherNewbplusplus