У меня есть ситуация, когда время отображения TreeView, с двумя уровнями записей (родителей и детей), например, так:JavaFX: Добавление функциональности CTRL-клик для флажков вложенной CheckBoxTreeItem [с]
root (invisible)
|_ parent item 1
|_ child item 1-1
|_ child item 1-2
|_ parent item 2
|_ child item 2-1
Все эти предметы являются стандартными CheckBoxTreeItem
s. То, что я хочу сделать, состоит в том, чтобы щелкнуть CTRL на флажке parent item
, выберите набор его дочерних элементов, согласно некоторым функциям. Например, здесь может потребоваться только первый дочерний элемент (т. Е. child item 1-1
и child item 2-1
) в каждом дочернем списке, который будет выбран после нажатия CTRL на родительский флажок.
Возможно ли это? Насколько я вижу, нет никакого способа получить доступ к флажку и передать его, например. обработчик события onMouseClick, который будет иметь смысл для меня.
Код для макета пример дерева приведены выше:
TreeViewTest.java
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.CheckBoxTreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.control.cell.CheckBoxTreeCell;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class TreeViewTest extends Application {
@Override
public void start(final Stage stage) {
StackPane sceneRoot = new StackPane();
// create the tree model
CheckBoxTreeItem<String> parent1 = new CheckBoxTreeItem<>("parent 1");
CheckBoxTreeItem<String> parent2 = new CheckBoxTreeItem<>("parent 2");
CheckBoxTreeItem<String> child1_1 = new CheckBoxTreeItem<>("child 1-1");
CheckBoxTreeItem<String> child1_2 = new CheckBoxTreeItem<>("child 1-2");
CheckBoxTreeItem<String> child2_1 = new CheckBoxTreeItem<>("child 2-1");
CheckBoxTreeItem<String> root = new CheckBoxTreeItem<>("root");
// attach the nodes
parent1.getChildren().addAll(child1_1, child1_2);
parent2.getChildren().addAll(child2_1);
root.getChildren().addAll(parent1, parent2);
// display everything
root.setExpanded(true);
parent1.setExpanded(true);
parent2.setExpanded(true);
// create the treeView
final TreeView<String> treeView = new TreeView<>();
treeView.setShowRoot(false);
treeView.setRoot(root);
// set the cell factory
treeView.setCellFactory(CheckBoxTreeCell.forTreeView());
// display the tree
sceneRoot.getChildren().addAll(treeView);
Scene scene = new Scene(sceneRoot, 200, 200);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
Main.launch(args);
}
}
Вам нужно реализовать 'TreeCell' себя, вместо того чтобы использовать реализацию удобства' CheckBoxTreeCell' (который не дает вам доступ к «CheckBox», как вы отметили). Поскольку вы знаете, что ваши элементы дерева являются 'CheckBoxTreeItem', и вы работаете только с' String' в качестве своего типа, это не так сложно. –
@James_D Вот чего я боялся. Я попытался сделать копию CheckBoxTreeCell для обращения к пакету javafx (желая изменить минимальную сумму кода, учитывая, что я в значительной степени не уверен, что он делает) и получил исключение IllegalAccessException о невозможности доступа к суперклассу DefaultTreeCell из моего CustomCBTC. Я думаю, что это больше проблема с моим пониманием Java в целом, хотя (логически я не понимаю, почему это не должно работать, но hey ho). В любом случае, попробовал еще раз, минимально скопировав код из CBTC в новый класс в моем собственном пакете, и, похоже, он работает, поэтому, спасибо! –