GUI компонент для выбора папки с опцией выбора - PullRequest
3 голосов
/ 06 августа 2011

Мне нужно создать компонент, как показано на рисунке - дерево с выбором каталога через флажок. Есть ли встроенный компонент для этого (как и другие, такие как JFileChooser и т. Д.)?

enter image description here

Ответы [ 5 ]

6 голосов
/ 06 августа 2011

Есть ли встроенный компонент для этого (как и другие, такие как JFileChooser и т. Д.)?

Нет, не готовый компонент для этой конкретной цели.OTOH не очень сложно собрать что-то вместе, используя JTree.

. Вы можете начать с кода, показанного на https://stackoverflow.com/questions/6182110/file-browser-gui.. Используется дерево.

image

Узлы с флажками

.. дерево с выбором каталога с помощью флажка.

Выбор с помощью.флажок делает это немного сложнее.Вот два возможных подхода:

Использовать средство визуализации

Это позволяет многократный выбор таким же образом, как несколько узлов могут быть выбраны в стандартном дереве, но меняет цвет выбора 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.

3 голосов
/ 06 августа 2011

Пакет общих ресурсов JIDE (с открытым исходным кодом) поставляется с выбором папки.Тем не менее, я не уверен, что позволяет несколько вариантов с флажками.Вы должны были бы взглянуть на это, чтобы проверить, делает ли это.Я использовал другие компоненты из пакета и был доволен ими, но сам этот компонент не использовал.Вы найдете его на сайте JIDE .

3 голосов
/ 06 августа 2011

А как насчет JTree? Предлагаю вам также прочитать учебник Как использовать деревья .

2 голосов
/ 06 августа 2011

Я не уверен, но вы всегда можете сделать его самостоятельно ...

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

Если у вас есть какие-либо вопросы или код не работает,Просто спроси.:)

0 голосов
/ 01 октября 2012

Просто взгляните на CheckboxTree :

CheckboxTree - это компонент Java Swing, который предоставляет Tree с флажками в каждом узле.Флажки могут переключаться между двумя состояниями (отмечено и не отмечено).Также отключены и серые флажки.

Я думаю, это то, что вы ищете.

...