Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查';选定的';按下按钮后在JCheckBoxTree中创建项的_Java_Swing_Jtree_Jcheckbox_Defaultmutabletreenode - Fatal编程技术网

Java 如何检查';选定的';按下按钮后在JCheckBoxTree中创建项的

Java 如何检查';选定的';按下按钮后在JCheckBoxTree中创建项的,java,swing,jtree,jcheckbox,defaultmutabletreenode,Java,Swing,Jtree,Jcheckbox,Defaultmutabletreenode,我有一个定制的JCheckBoxTree,其代码取自此。 因此,我希望能够访问此树的每个复选框的状态。例如,我想通过按下按钮将树的某个项目设置为“已选定”。我想我需要做一个循环来遍历DefaultMutableTreeNode,如果节点文件等于指定的文件/字符串,则将其状态更改为SELECTED。然而,我不确定这样做是否正确,也无法实现 这是我尝试的,(不起作用): 以下行是我的主文件中的相关代码: JTreeModification treeClass = new JTreeM

我有一个定制的JCheckBoxTree,其代码取自此。
因此,我希望能够访问此树的每个复选框的状态。例如,我想通过按下按钮将树的某个项目设置为“已选定”。我想我需要做一个循环来遍历
DefaultMutableTreeNode
,如果节点文件等于指定的文件/字符串,则将其状态更改为
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可以完成这项工作。但是仍然存在两个问题,第一,它不会在所有节点上循环。第二,虽然它将
选定的
分配给文件,并且我可以在控制台打印中识别它,但它不会显示在UI中,直到我检查或按下树中的另一项,然后它更新UI并设置
Video1.avi
。因此,它需要在所有节点上循环并更新UI。

您如何评估节点?您可以通过使用递归算法在树模型上迭代并返回所有选定的项…@MadProgrammer您的意思是将文件分配给DefaultMutableTreeNode吗?如果是这样,
for(File fileSystemRoot:myTest.listFiles()){DefaultMutableTreeNode node=newdefaultmutabletreenode(treeClass.new CheckBoxNode(fileSystemRoot,jtreedimodification.Status.DESELECTED));root.add(node);}
执行此操作。看起来是这样!我更好奇的是你是如何遍历树节点的……问题是,
DefaultMutableTreeNode
怎么可能等于
file4.json
DefaultMutableTreeNode
toString
(来自内存)正在使用
userObject
属性
toString
结果。。。
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);
        }
    }