1

いくつかのサブツリー(カテゴリ)を持つツリーがあります。たとえば、指定したサブツリーでのみ複数選択アクションを許可するには、カテゴリ内のノードを複数選択できますが、他のカテゴリ内のノードを選択しようとすると、現在のサブツリーのノードの選択を解除し、新しいノードを選択します。

4

2 に答える 2

4

JTreeを使用して、のデフォルトの選択モデルを変更します。setSelectionModel

独自の実装を提供するTreeSelectionModel

于 2013-02-05T15:59:21.250 に答える
2

TreeSelectionModelを実装する必要はありません。デフォルトのモデルでTreeSelectionListenerを実装するだけで十分です。これは半ば機能する例です。完全に機能するにはもう少し調整が必要ですが、それは原理を示しています。

    JFrame f = new JFrame("JTree test");
    f.setSize(300, 300);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    JTree t = new JTree();
    DefaultTreeModel model = (DefaultTreeModel) t.getModel();
    final TreeSelectionModel selectionModel = t.getSelectionModel();

    selectionModel.setSelectionMode(TreeSelectionModel.CONTIGUOUS_TREE_SELECTION);
    selectionModel.addTreeSelectionListener(new TreeSelectionListener() {
        @Override
        public void valueChanged(TreeSelectionEvent e) {
            // detect additive selections
            if (e.isAddedPath()) {
                TreePath selection = e.getPath();
                DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) selection
                        .getLastPathComponent();

                // a contrived way to detect selection of items within a category
                if (((String) selectedNode.getUserObject())
                        .startsWith("Item")) {
                    // get the new selection's category node
                    DefaultMutableTreeNode category = (DefaultMutableTreeNode) selection
                            .getParentPath().getLastPathComponent();

                    // deselect everything outside that category
                    ArrayList<TreePath> deselectList = new ArrayList<TreePath>();
                    for (TreePath path : selectionModel.getSelectionPaths()) {
                        if (!category.equals(path.getParentPath()
                                .getLastPathComponent())) {
                            deselectList.add(path);
                        }
                    }
                    selectionModel.removeSelectionPaths(deselectList
                            .toArray(new TreePath[deselectList.size()]));
                } else {
                    // completely prevent selection of categories
                    selectionModel.removeSelectionPath(selection);
                }
            }
        }
    });

    DefaultMutableTreeNode root = new DefaultMutableTreeNode();
    DefaultMutableTreeNode category1 = new DefaultMutableTreeNode("Category 1");
    DefaultMutableTreeNode category2 = new DefaultMutableTreeNode("Category 2");
    DefaultMutableTreeNode item1 = new DefaultMutableTreeNode("Item 1");
    DefaultMutableTreeNode item2 = new DefaultMutableTreeNode("Item 2");
    DefaultMutableTreeNode item3 = new DefaultMutableTreeNode("Item 3");
    DefaultMutableTreeNode item4 = new DefaultMutableTreeNode("Item 4");

    category1.add(item1);
    category1.add(item2);
    category2.add(item3);
    category2.add(item4);

    root.add(category1);
    root.add(category2);

    t.setRootVisible(false);
    model.setRoot(root);

    f.getContentPane().add(new JScrollPane(t));
    f.setVisible(true); 
于 2013-02-05T16:41:23.490 に答える