Я пытаюсь создать представление дерева JavaFX, в котором есть элементы дерева флажков. Я требую, чтобы все узлы, у которых есть дети, были отключены. Но все дочерние элементы этих узлов должны быть кликабельными.
В принципе, если элемент дерева является листом, его следует включить и щелкнуть.
Это текущий код, который я использовал. Который отключает узлы с дочерними элементами, но проблема в том, что, поскольку он отключен, я не могу получить доступ к коду внутри родительского элемента.
public class App extends Application
{
public static void main( String[] args )
{
launch(args);
}
private List<Dependant> myList = new ArrayList();
@SuppressWarnings("unchecked")
@Override
public void start(Stage primaryStage) {
CheckBoxTreeItem<String> rootItem = new CheckBoxTreeItem("Root");
final List<CheckBoxTreeItem<String>> treeItems = new ArrayList(6);
for (int i = 0; i < 6; i++) {
CheckBoxTreeItem<String> item = new CheckBoxTreeItem("L0"+i+"");
item.setIndependent(true);
treeItems.add(item);
myList.add(new Dependant("0"+i+"", "type1"));
}
rootItem.getChildren().addAll(treeItems);
rootItem.setExpanded(true);
rootItem.setIndependent(true);
CheckBoxTreeItem<String> rootItem2 = new CheckBoxTreeItem("folder");
final List<CheckBoxTreeItem<String>> treeItems2 = new ArrayList(6);
for (int i = 0; i < 6; i++) {
CheckBoxTreeItem<String> item = new CheckBoxTreeItem("L1"+i+"");
item.setIndependent(true);
treeItems2.add(item);
myList.add(new Dependant("0"+i+"", "type2"));
}
rootItem2.getChildren().addAll(treeItems2);
rootItem2.setIndependent(true);
rootItem.getChildren().set(2,rootItem2);
TreeView tree = new TreeView(rootItem);
tree.setCellFactory((Object item) -> {
final CheckBoxTreeCell<String> cell = new CheckBoxTreeCell();
cell.itemProperty().addListener((obs,s,s1)->{
cell.disableProperty().unbind();
if(s1!=null && !s1.isEmpty()){
BooleanProperty prop = new SimpleBooleanProperty();
prop.set((s1.equals("folder")));
cell.disableProperty().bind(prop);
}
});
return cell;
});
tree.setRoot(rootItem);
StackPane root = new StackPane();
root.getChildren().add(tree);
primaryStage.setScene(new Scene(root, 300, 250));
primaryStage.show();
}
}
Это не окончательный код моего приложения, это просто пример кода, который я опробовал перед окончательной реализацией.
Как видно из кода, свойство disabled ячейки связано с тем, равно ли имя «папке», поскольку метод isLeaf()
недоступен.
Если кому-то интересно, почему мне нужно отключить все родительские узлы, то это потому, что в финальной реализации мне требуется, чтобы во всем древовидном представлении был выбран только один элемент (так как щелчок по родительскому узлу также выберет всех его дочерних узлов!).
Спасибо.