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

时间:2011-08-06 11:46:19

标签: java swing user-interface jfilechooser

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

enter image description here

5 个答案:

答案 0 :(得分:6)

  

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

不,不是针对该特定目的的现成组件。 OTOH使用JTree将一些东西放在一起并不是很困难。

您可以从https://stackoverflow.com/questions/6182110/file-browser-gui上显示的代码开始。它使用树。

带复选框的节点

  

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

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

使用渲染器

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

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

Check-box tree

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;
    }
}

定义自定义对象

您可能采用的一种方法是将自定义对象放入树中,而不是File个实例。自定义对象可能被称为SelectableDirectory并且具有File directory& boolean selected作为属性。类似的东西:

public class SelectableDirectory {

    private File directory;
    private boolean selected;
    // getters and setters, constructor..
}

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

答案 1 :(得分:3)

JTree怎么样?我建议你也阅读How To Use Trees教程。

答案 2 :(得分:3)

JIDE commons包(开源)附带一个文件夹选择器。但是,我不确定它是否允许使用复选框进行多项选择。你必须看一下它来检查它的确如此。我已经使用了包中的其他组件并对它们感到满意,但我自己并没有使用过那个特定的组件。您可以在the JIDE website找到它。

答案 3 :(得分:2)

我不确定,但你总能自己制作一个......

File chooser combobox

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

class JFileChooser extends JPanel implements ActionListener {

    JComboBox fileList;

    public JFileChooser() {
        super(new BorderLayout());
        JLabel fileLabel = new JLabel("Select a file: ");
        fileList = new JComboBox(
            new File(System.getProperty("user.home")).listFiles() );
        JButton okbutton = new JButton("OK");
        JButton cancelbutton = new JButton("Cancel");
        okbutton.addActionListener(this);
        cancelbutton.addActionListener(this);
        add(fileLabel, BorderLayout.WEST);
        add(fileList, BorderLayout.CENTER);

        JPanel button = new JPanel(new FlowLayout(FlowLayout.CENTER));
        add(button, BorderLayout.SOUTH);
        button.add(cancelbutton);
        button.add(okbutton);
    }

    public void actionPerformed(ActionEvent event) {
        String command = event.getActionCommand();
        if (command.equals("Cancel")) {
            System.exit(0);
        }
        if (command.equals("OK")) {
            Object result = fileList.getSelectedItem();
            String selectedFile = result.toString();
            System.out.println("SELECTED: "+ selectedFile);
            //do whatever you want with the file here
        }
    }
}

public class whatever extends JFrame {
    public whatever() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JFileChooser chooser = new JFileChooser();
        add(chooser);
        pack();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new whatever().setVisible(true);
            }
        });
    }
}

如果您有任何问题或代码不起作用,请询问。 :)

答案 4 :(得分:0)

只需查看CheckboxTree

  

CheckboxTree是一个Java Swing组件,它在每个节点中为Tree提供了一个复选框。复选框可以在两种状态之间切换(已选中和未选中)。还支持禁用和灰化复选框。

我认为这就是你要找的东西。