2013-09-25 36 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);