Как проверить "выбранный" элемент в JCheckBoxTree после нажатия кнопки

У меня есть настроенное JCheckBoxTree, код которого взят из этого источника. Поэтому я хочу иметь доступ к статусу каждого CheckBox этого дерева. Например, я хочу установить элемент дерева как "ВЫБРАННЫЙ", нажав кнопку. Я думаю, что мне нужно сделать цикл, чтобы пройти через DefaultMutableTreeNode и если файл узла равен указанному файлу / строке, измените его состояние на SELECTED, Однако я не уверен, является ли это правильным способом сделать такую ​​вещь, а также не смог ее достичь.

Вот что я попробовал (не работает):

public void finder(DefaultMutableTreeNode root){
        JTreeModification treeClass = new JTreeModification();
        Enumeration en = root.depthFirstEnumeration();
        //if(){}
        while (en.hasMoreElements()) {
            DefaultMutableTreeNode node = (DefaultMutableTreeNode) en.nextElement();
            if(node.equals("file4.json")){
               treeClass.new CheckBoxNode(new File(node.getParent(), node), JTreeModification.Status.SELECTED);
            }
        }
}

Следующие строки являются связанными кодами из моего основного файла:

        JTreeModification treeClass = new JTreeModification();
        File myTest = new File("D:\\Documents\\A X");
        DefaultMutableTreeNode root = new DefaultMutableTreeNode();
        final DefaultTreeModel treeModel = new DefaultTreeModel(root);

        for (File fileSystemRoot: myTest.listFiles()) {
            DefaultMutableTreeNode node = new DefaultMutableTreeNode(treeClass.new CheckBoxNode(fileSystemRoot, JTreeModification.Status.DESELECTED));
            root.add(node);
        }
        treeModel.addTreeModelListener(treeClass.new CheckBoxStatusUpdateListener());
        final JTree tree = new JTree(treeModel) {
            @Override public void updateUI() {
                setCellRenderer(null);
                setCellEditor(null);
                super.updateUI();
                //???#1: JDK 1.6.0 bug??? Nimbus LnF
                setCellRenderer(treeClass.new FileTreeCellRenderer());
                setCellEditor(treeClass.new CheckBoxNodeEditor());
            }
        };
        tree.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));
        tree.setRootVisible(false);
        tree.addTreeSelectionListener(treeClass.new FolderSelectionListener());

        tree.setEditable(true);
        tree.expandRow(0);

        panel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
        panel.add(new JScrollPane(tree), BorderLayout.CENTER);

Вот класс, который, я думаю, связан с моей проблемой:

public enum Status { SELECTED, DESELECTED, INDETERMINATE }

class CheckBoxNode {
        public final File file;
        public Status status;
        public CheckBoxNode(File file) {
            this.file = file;
            status = Status.INDETERMINATE;
        }
        public CheckBoxNode(File file, Status status) {
            this.file = file;
            this.status = status;
        }
        @Override public String toString() {
            return file.getName();
        }
}

В предоставленной ссылке GitHub есть метод, начинающийся со строки 72, который делает нечто похожее на то, что я хочу, но я не смог объединить его с моим методом.

Так есть ли идеи о том, как программно изменить статус элемента дерева?

РЕДАКТИРОВАТЬ:

public void finder(DefaultMutableTreeNode root){
        JTreeModification treeClass = new JTreeModification();
        Object o = root.getLastChild();
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) o;
        o = node.getUserObject();
        CheckBoxNode check = (CheckBoxNode) o;
        System.out.println(check);
        if(check.toString().equals("Video1.avi")){
            check.status = JTreeModification.Status.SELECTED; 
            //treeModel.addTreeModelListener(treeClass.new CheckBoxStatusUpdateListener());
        }
        System.out.println(check.status);

        Enumeration e = node.children();
            while (e.hasMoreElements()) {
                finder(root);
        }
    }

Я только что заметил, что приведенный выше код может назначить "SELECTED" первому файлу итерации, если его имя совпадает с именем в операторе if. (Video1.avi) в этом примере. Так что я уверен check.status = JTreeModification.Status.SELECTED; могу сделать работу. Но есть еще две проблемы, во-первых, это не зацикливание на всех узлах. и во-вторых, хотя он назначает Selected к файлу, и я мог бы распознать это в консоли печати, но он не показывает его в пользовательском интерфейсе, пока я не проверю или не нажму другой элемент в дереве, затем он обновит пользовательский интерфейс и установить Video1.avi, Таким образом, он должен зациклить все узлы и обновить пользовательский интерфейс.

0 ответов

Другие вопросы по тегам