2013-09-25 33 views
1

我有一个javafx复选框树。当点击树项目时,我需要选择复选框。我已经为树视图的选择属性添加了一个侦听器。但是只有当树项被点击时,侦听器才会被触发。单击复选框时,上述侦听器不会被触发。JavaFX CheckBoxTreeItem选择

必需:在树视图中单击树项目或复选框时触发的侦听器。

代码:

String memberArray = {"subChild1", "subChild2", "childSub1"} 
Group groupRoot = new Group(); 
Scene scene = new Scene(groupRoot, Color.ALICEBLUE); 
HBox hBox = new HBox(); 
hBox.setMaxWidth(fxPanel.getWidth()); 
final Label royalLabel = new Label("Select a item"); 

TreeSet<String> prefixMember = new TreeSet<String>(); 
String tmpName = null; 
LinkedHashSet<CheckBoxTreeItem<String>> treeItems = new LinkedHashSet<CheckBoxTreeItem<String>>(); 
LinkedHashSet<CheckBoxTreeItem<String>> treeSubItems = new LinkedHashSet<CheckBoxTreeItem<String>>(); 

for (String item : memberArray) { 
    if (!item.isEmpty()) { 
     tmpName = item.substring(0, 3); 
     prefixMember.add(tmpName); 
    } 
} 

// Create and empty TreeView 
TreeView<String> duckTree = new TreeView<String>(); 

// Create TreeItems for the Hierarchy of the TreeView 
CheckBoxTreeItem<String> root = new CheckBoxTreeItem<String>("Parent"); 
CheckBoxTreeItem<String> lm1 = new CheckBoxTreeItem<String>("Child1"); 
CheckBoxTreeItem<String> lm2 = new CheckBoxTreeItem<String>("Child2"); 

for (String item : prefixMember) { 
    CheckBoxTreeItem<String> treeItem = new CheckBoxTreeItem<String>(item.toString()); 
    for (String subItem : memberArray) { 
     if (!subItem.isEmpty() && subItem.substring(0, 3).equals(item)) { 
      CheckBoxTreeItem<String> treeSubItem = new CheckBoxTreeItem<String>(
         subItem.toString()); 
        treeSubItems.add(treeSubItem); 
     } 
    } 
    treeItems.add(treeItem); 
    treeItem.getChildren().addAll(treeSubItems); 
    treeSubItems.clear(); 
} 

root.getChildren().addAll(treeItems); 
treeItems.clear(); 

// Create a TreeView using the root TreeItem 
TreeView<String> royalTree = new TreeView<String>(root); 
royalTree.setCellFactory(CheckBoxTreeCell.<String>forTreeView()); 

// Set a ChangeListener to handle events that occur with a Treeitem 
// is selected 
royalTree.getSelectionModel().selectedItemProperty() 
     .addListener(new ChangeListener<TreeItem<String>>() { 
      public void changed(
        ObservableValue<? extends TreeItem<String>> observableValue, 
        TreeItem<String> oldItem, TreeItem<String> newItem) { 
       // Gets fired only on selection of tree item 
       // Need to get fired on selection of check box too 
       // Select the respective checkbox on selection of tree item 
      } 
     }); 

hBox.getChildren().add(royalTree); 
groupRoot.getChildren().add(hBox); 
fxPanel.setScene(scene); 

回答

0

你需要立即每次选择一个事件?如果不是,您可以创建所有checkboxtree项目的数组列表,并在您需要时遍历该列表以检查是否选中。

1

我有同样的问题,搜索looong时间。令人遗憾的是,从oracle中没有官方文档。

答案是设置CellFactory并调用getSelectedStateCallback().call(this.getTreeItem());
您treeItem中的updateItem:

// set cellFactory 
royalTree.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() { 
    @Override 
    public TreeCell<String> call(TreeView<String> p) { 
     // return new CheckBoxTreeCell, you also can make a new class with this 
     return new CheckBoxTreeCell<String>() { 
      @Override 
      public void updateItem(String item, boolean empty) { 
       super.updateItem(item, empty); 
       if (!empty) { 
        // call the selectedStat Callback for treeitem 
        ObservableValue<Boolean> selectedState = getSelectedStateCallback().call(this.getTreeItem()); 
        if (selectedState != null) { 
         // do something here 
        } 
       } 
      } 
     }; 
    } 
}); 

我已经在FX 8测试这一点,但它也应该在FX工作2.2

快乐编码,
kalasch

1

你可以只在树中添加事件处理程序到您的根项目:

rootItem.addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), new EventHandler<TreeModificationEvent<Object>>() { 

      @Override 
      public void handle(TreeModificationEvent<Object> event) { 
       // Your code here. 
      } 
     }); 
1

是的,添加一个事件处理程序到树项目的作品。下面是一些示例代码(Java 8),其中TreeView的项目为CheckBoxTreeItem:

CheckBoxTreeItem<Path> rootItem = new CheckBoxTreeItem<>(rootDirPath); 
rootItem.addEventHandler(
     CheckBoxTreeItem.<Path>checkBoxSelectionChangedEvent(), 
     (TreeModificationEvent<Path> e) -> { 
    CheckBoxTreeItem<Path> item = e.getTreeItem(); 
    if (item.isSelected() || item.isIndeterminate()) { 
     System.out.println("Some items are checked"); 
    } 
    else { 
     System.out.println("Some items are unchecked"); 
    }  
}); 
TreeView<Path> tree = new TreeView<>(rootItem); 
tree.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);