1

私はjavafxチェックボックスツリーを持っています。ツリー項目をクリックしたときにチェックボックスを選択する必要があります。ツリー ビューの選択プロパティのリスナーを追加しました。ただし、リスナーは、ツリー項目がクリックされたときにのみ起動されます。上記のリスナーは、チェックボックスがクリックされたときに起動されません。

必須: ツリービューでツリー項目またはチェックボックスがクリックされたときに起動するリスナー。

コード:

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);
4

4 に答える 4

1

私は同じ問題を抱えていて、時間をかけて検索しました。残念ながら、これに関するオラクルの公式ドキュメントはありません。

答えは、CellFactory を設定し、updateItem で treeItem に対して を呼び出すことgetSelectedStateCallback().call(this.getTreeItem());
です。

// 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 でも動作するはずです。

幸せなコーディング、
カラッシュ

于 2014-03-28T11:53:18.013 に答える
0

選択ごとにすぐにイベントが必要ですか? そうでない場合は、すべてのチェックボックスツリーアイテムの配列リストを作成し、それを繰り返して、必要に応じて選択されているかどうかを確認できます。

于 2013-12-16T20:46:05.070 に答える