В TreeView, как обновить родительский CheckBoxTreeItem, когда дочерний CheckBoxTreeItem проверяет / снимает флажки - PullRequest
0 голосов
/ 24 мая 2019

У меня есть TreeItem с флажками. По сути, я хочу, чтобы, когда я проверял флажок листа, принудительно вызывал updateItem для всех его родителей. Вот мой код:

    package erlang.visual.tracer.gui;

import javafx.application.Application;
import javafx.css.PseudoClass;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.CheckBoxTreeCell;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.net.URL;

import static javafx.scene.control.TreeItem.valueChangedEvent;

public class TreeViewLearningMain2 extends Application {

    private TreeView<String> treeView;
    private Button okButton;
    private PseudoClass leafPseudoClass = PseudoClass.getPseudoClass("leaf");
    private PseudoClass nonLeafPseudoClass = PseudoClass.getPseudoClass("non-leaf");

    @Override
    public void start(Stage stage) {

        BorderPane rootPane = new BorderPane();
        okButton = new Button("OK");
        okButton.setOnAction(this::okButtonOnAction);

        treeView = new TreeView<>();
        treeView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        CheckBoxTreeItem<String> rootItem = new CheckBoxTreeItem<>("Classes");
        treeView.setRoot(rootItem);
        rootItem.setIndependent(true);

        for (int i = 0; i < 3; i++) {
            CheckBoxTreeItem<String> item = new CheckBoxTreeItem<>("Class " + (i + 1));
            item.setIndependent(true);
            rootItem.getChildren().add(item);
            for (int j = 0; j < 10; j++) {
                CheckBoxTreeItem<String> innerItem = new CheckBoxTreeItem<>("Student " + (j + 1));
                innerItem.setIndependent(true);
                item.getChildren().add(innerItem);
            }
        }

        rootItem.addEventHandler(CheckBoxTreeItem.checkBoxSelectionChangedEvent(), e -> {
            if (e.getTreeItem().isLeaf()) {
                TreeItem<String> parentTreeItem = (TreeItem) e.getTreeItem().getParent();
                TreeItem.TreeModificationEvent<String> ev = new TreeItem.TreeModificationEvent<>(valueChangedEvent(), parentTreeItem);
                Event.fireEvent(parentTreeItem, ev);
            }
        });

        treeView.setCellFactory(p -> new CheckBoxTreeCell<>() {
            @Override
            public void updateItem(String item, boolean empty) {
                super.updateItem(item, empty);
                if (item != null && !item.isEmpty()) {
                    if (item.startsWith("Student")) {
                        System.out.println(String.format("updateItem(String %s, boolean %s)", item, Boolean.toString(empty)));
                        pseudoClassStateChanged(leafPseudoClass, true);
                        pseudoClassStateChanged(nonLeafPseudoClass, false);
                    } else {
                        pseudoClassStateChanged(leafPseudoClass, false);
                        pseudoClassStateChanged(nonLeafPseudoClass, true);
                    }
                }
            }
        });

        rootPane.setCenter(treeView);
        rootPane.setBottom(okButton);

        Scene scene = new Scene(rootPane, 1024, 768, Color.WHITE);

        URL style = TreeViewLearningMain2.class.getClassLoader().getResource("style.css");
        scene.getStylesheets().add(style.toExternalForm());

        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    private void okButtonOnAction(ActionEvent e) {
        System.out.println("ok");
    }
}

Пожалуйста, игнорируйте CSS, это не имеет значения. Так что, ребята, в основном, я установил событие для проверки флажка листьев. Когда это происходит, я запускаю событие для родителя этого флажка, но по какой-то причине всякий раз, когда я ставлю / снимаю флажок с листа, я вижу много строк печати. ​​

Например, проверка флажка Student1 из Class1 производит:

updateItem(String Student 1, boolean false)
updateItem(String Student 2, boolean false)
updateItem(String Student 3, boolean false)
updateItem(String Student 4, boolean false)
updateItem(String Student 5, boolean false)
updateItem(String Student 6, boolean false)
updateItem(String Student 7, boolean false)
updateItem(String Student 8, boolean false)
updateItem(String Student 9, boolean false)
updateItem(String Student 10, boolean false)

Как видите, для каждого ученика вызывается обновленный предмет.

Как я могу сделать так, чтобы всякий раз, когда я отмечал / снимал флажок листа, родительский флажок получал только вызов updateItem?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...