4

我一直在阅读 javax.swing 中的 JFileChooser。* 我知道 showOpenDialog() 方法将允许我选择一个文件并单击“选择”,但我有一个我希望它工作的特定方式。

我想使用两个 JFileChooser(可能在 JPanel 中并排)来选择 TO 和 FROM 路径,然后单击一个按钮,该按钮将从两个“Chooser”获取用户输入并执行某些操作。

也许如果有人有一个像这样只做一个 JFileChooser 的例子?本质上只是在选择器中突出显示文件/目录并单击一些其他按钮以从“选择器”中获取输入(也隐藏了 JFileChoosers 按钮(取消和选择))。

这个“其他”按钮很可能只是向代码发出信号以从 JFileChooser 对象中获取值。

我希望作为 Swing 的新手,我还缺少另一个可以完成我所描述的内容的课程,但它只是没有出现在我一直在制作的 Google 搜索中。

4

3 回答 3

5

这是我的第一次通过(我在我的 Mac 上,所以我在遍历 JDK 源代码时遇到了一些问题;))

问题是,摆脱cancelokay按钮......

在此处输入图像描述

public class TestFileChooser2 {

    public static void main(String[] args) {
        new TestFileChooser2();
    }

    public TestFileChooser2() {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MainPane());
                frame.setSize(800, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });

    }

    protected class MainPane extends JPanel {

        private JFileChooser fileChooser;
        private JPanel filePane;

        private JTextField fileField;

        public MainPane() {

            setLayout(new BorderLayout());

            fileChooser = new JFileChooser();
            fileChooser.addPropertyChangeListener(new PropertyChangeListener() {

                @Override
                public void propertyChange(PropertyChangeEvent evt) {
                    if (evt.getPropertyName().equals("SelectedFileChangedProperty")) {
                        File file = fileChooser.getSelectedFile();
                        if (file != null) {
                            setFile(file);
                        }
                    }
                }
            });

            add(fileChooser, BorderLayout.WEST);

            filePane = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            fileField = new JTextField(10);
            filePane.add(fileField, gbc);

            add(filePane);

        }

        protected void setFile(File file) {

            fileField.setText(file.getPath());

        }

    }
}

更新

显然 Windows 不喜欢与属性更改侦听器玩得很好......

在此处输入图像描述

毫无疑问,这是一个完整的黑客......

public class TestFileChooser2 {

    public static void main(String[] args) {
        new TestFileChooser2();
    }

    public TestFileChooser2() {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new MainPane());
                frame.setSize(800, 400);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });

    }

    protected class MainPane extends JPanel {

        private JFileChooser fileChooser;
        private JPanel filePane;
        private JTextField fileField;

        public MainPane() {

            setLayout(new BorderLayout());

            fileChooser = new JFileChooser();
            fileChooser.setApproveButtonText("delete");
            removeButtons(fileChooser);

            JList list = findFirstChildren(fileChooser, JList.class);
            list.addListSelectionListener(new ListSelectionListener() {
                @Override
                public void valueChanged(ListSelectionEvent e) {
                    if (!e.getValueIsAdjusting()) {
                        File file = (File)((JList)e.getSource()).getSelectedValue();
                        if (file != null) {
                            setFile(file);
                        }
                    }
                }
            });

//            fileChooser.addPropertyChangeListener(new PropertyChangeListener() {
//                @Override
//                public void propertyChange(PropertyChangeEvent evt) {
//                    System.out.println(evt.getPropertyName());
//                    if (evt.getPropertyName().equals("SelectedFileChangedProperty")) {
//                        File file = fileChooser.getSelectedFile();
//                        if (file != null) {
//                            setFile(file);
//                        }
//                    }
//                }
//            });

            add(fileChooser, BorderLayout.WEST);

            filePane = new JPanel(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 0;
            gbc.gridy = 0;
            gbc.weightx = 1;
            gbc.fill = GridBagConstraints.HORIZONTAL;

            fileField = new JTextField(10);
            filePane.add(fileField, gbc);

            add(filePane);

        }

        protected void setFile(File file) {

            fileField.setText(file.getPath());

        }

        protected void removeButtons(Container container) {
            for (Component child : container.getComponents()) {

                if (child instanceof JButton) {
                    JButton btn = (JButton) child;
                    if (btn.getText() != null && (btn.getText().equals(fileChooser.getApproveButtonText()) || btn.getText().equals("Cancel"))) {
                        container.remove(child);
                    }
                } else if (child instanceof Container) {
                    removeButtons((Container) child);
                }

            }
        }

        public <T extends Component> T findFirstChildren(JComponent component, Class<T> clazz) {

            T child = null;
            for (Component comp : component.getComponents()) {

                if (clazz.isInstance(comp)) {

                    child = (T) comp;
                    break;

                } else if (comp instanceof JComponent) {

                    child = findFirstChildren((JComponent) comp, clazz);
                    if (child != null) {
                        break;
                    }

                }

            }

            return child;

        }
    }
}

更好的解决方案是FileSystemView直接利用并构建您自己的视图,但这比我现在有时间更努力:(

于 2012-10-02T20:03:16.303 回答
5

示例JFileChooser通过覆盖批准和取消方法扩展为直接处理选择。

class MyChooser extends JFileChooser {

    @Override
    public void approveSelection() {
        ...
    }

    @Override
    public void cancelSelection() {
        ...
    }
}
于 2012-10-02T21:13:28.003 回答
2

编辑:根据@MadProgrammer,这是不正确的。

JFileChooser是一个旨在执行打开和保存内容的对话框。您可以更改按钮的名称并可能删除取消。但是您不能将其作为面板打开。

但是,它是一个对话框,需要进行相当多的修改才能将其嵌入到页面中。源是可用的,所以它是可能的。您可以重用这些javax.swing.filechooser类。

于 2012-10-02T19:52:42.240 回答