0

我正在使用 CheckBoxTree 类,它是 JIDE 公共层包 (http://jidesoft.com/products/oss.htm) 的一部分。我想要做的是保存和加载 CheckBoxTreeSelectionModel 的状态,它跟踪哪些框被选中或不被选中。我可以通过保存 selectionModel.getSelectionPaths() 来保存它,但我的问题是加载它。当我 selectionModel.setSelectionPaths() 它只检查路径的根和叶的框,但两者之间没有任何内容。奇怪的是,当我保存 getSelectionPaths() 的结果然后将其直接输入 setSelectionPaths() 时,也会发生这种情况。

对于 FileSystemModel,我使用了一些我发现的喜欢使用 File 对象而不是 TreeNodes 的代码。我尝试了在网络上不同地方找到的 FileSystemModels 和 CheckBoxTrees 的不同组合,结果总是相同的。我可能在这个问题上花了将近 20 个小时……承认这有点尴尬。任何帮助表示赞赏!

我的代码如下。这将创建 CheckBoxTree 并尝试使用“/Documents and Settings/Administrator”加载它,这会导致“/”和“Administrator”以及它的所有子项都被检查,而不是“Documents and Settings”。

public class CheckBoxTreeFrame {
    private FileSystemModel fileSystemModel = null;
    private CheckBoxTree checkBoxTree = null;
    private JFrame main_frame = null;
    private CheckBoxTreeSelectionModel selectionModel = null;

    public CheckBoxTreeFrame(){
        // create the model
        fileSystemModel = new FileSystemModel(new File(File.separator));
        // use the model for the Tree
        checkBoxTree = new CheckBoxTree(fileSystemModel);
        checkBoxTree.setEditable(false);
        // model for the checkboxes (not the directory structure)
        selectionModel = checkBoxTree.getCheckBoxTreeSelectionModel();
        // event listener
        checkBoxTree.getCheckBoxTreeSelectionModel().addTreeSelectionListener(new TreeSelectionListener() {
            public void valueChanged(TreeSelectionEvent e) {
                System.out.println(selectionModel.getSelectionPath());
            }
        });

        // setup a little UI window for the tree.
        main_frame = new JFrame("Frame Title");
        main_frame.add(checkBoxTree);
        main_frame.setSize(400, 400);
        main_frame.setVisible(true);

        // run the loading test
        runTest();
    }

    public void runTest(){
        File[] finalPath = new File[3];
        finalPath[0] = (File)selectionModel.getModel().getRoot();
        finalPath[1] = new File(finalPath[0],"Documents and Settings");
        finalPath[2] = new File(finalPath[1],"Administrator");

        selectionModel.setSelectionPath(new TreePath(finalPath));
    }
}

谢谢!!

4

1 回答 1

2

CheckBoxTreeSelectionModel 基本上是一个 DefaultTreeSelectionModel(如在 Swing 中)。树路径的技巧必须存在于 TreeModel 中。我认为您在 runTest 中创建 TreePath 的方式不会创建相同的树路径。最好从树中获取树路径。试试这个,它会工作的。

checkBoxTree.getCheckBoxTreeSelectionModel().addSelectionPath(checkBoxTree.getPathForRow(2));
于 2011-11-04T15:36:11.810 回答