使用select选项选择文件夹的GUI组件

Asg*_*har 3 java user-interface swing jfilechooser

我需要创建一个组件,如图所示 - 一个通过复选框选择目录的树.是否有内置组件(如其他JFileChooser等)?

在此输入图像描述

And*_*son 6

是否有内置组件(如其他JFileChooser等)?

不,不是针对该特定目的的现成组件.OTOH用一个东西扔东西并不是很困难JTree.

您可以从/sf/ask/432747731/上显示的代码开始.它使用一棵树.

带复选框的节点

..通过复选框选择目录的树.

通过选择.复选框让它变得有点棘手.这有两种可能的方法.

使用渲染器

这允许以与在标准树中选择多个节点相同的方式进行多选,但是交换BG选择颜色以用于选中的复选框.

然后,使用内置方法变得非常容易,JTree.getSelectionPaths()并通过单个方法调用处理多/单选择.

复选框树

import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
import java.io.*;

class TreeWithCheck {

    public static Component getTree(int selectionMode) {
        JTree tree = new JTree();
        tree.getSelectionModel().setSelectionMode(selectionMode);
        tree.setVisibleRowCount(8);
        SelectableTreeCellRenderer renderer =
            new SelectableTreeCellRenderer();
        tree.setCellRenderer(renderer);
        JScrollPane scroll = new JScrollPane(tree);
        Dimension d = scroll.getPreferredSize();
        scroll.setPreferredSize(
            new Dimension((int)d.getWidth()*2, (int)d.getHeight()));

        return scroll;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel trees = new JPanel(new GridLayout(0,2,5,5));

                trees.add(
                    getTree(TreeSelectionModel.SINGLE_TREE_SELECTION));
                trees.add(
                    getTree(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION));

                JOptionPane.showMessageDialog(null, trees);
            }
        });
    }
}

class SelectableTreeCellRenderer extends DefaultTreeCellRenderer {

    private JCheckBox selected;
    private JPanel renderComponent;

    public SelectableTreeCellRenderer() {
        selected = new JCheckBox();
        renderComponent = new JPanel(new BorderLayout());
        renderComponent.add(selected,BorderLayout.WEST);

        selected.setOpaque(false);
        renderComponent.setOpaque(false);
    }

    public Component getTreeCellRendererComponent(
        JTree tree,
        Object value,
        boolean sel,
        boolean expanded,
        boolean leaf,
        int row,
        boolean hasFocus) {

        Component c = super.getTreeCellRendererComponent(
            tree,
            value,
            false, // we pass 'false' rather than 'sel'
            expanded,
            leaf,
            row,
            hasFocus);

        selected.setSelected(sel);
        renderComponent.add(c,BorderLayout.CENTER);

        return renderComponent;
    }
}
Run Code Online (Sandbox Code Playgroud)

定义自定义对象

您可能采用的一种方法是将自定义对象放入树中,而不是File实例.自定义对象可能被称为a SelectableDirectory并具有File directory&boolean selected作为属性.就像是:

public class SelectableDirectory {

    private File directory;
    private boolean selected;
    // getters and setters, constructor..
}
Run Code Online (Sandbox Code Playgroud)

使用自定义渲染器为树返回JPanel包含复选框的树,BorderLayout.WESTJLabel使用图标和目录名称CENTER.