代码之家  ›  专栏  ›  技术社区  ›  Justin

使用JavaSwing选择一个文件路径,并使用该选择执行操作

  •  4
  • Justin  · 技术社区  · 12 年前

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

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

    也许有人举了一个这样做一个JFileChooser的例子?本质上只是突出显示选择器中的文件/目录,然后单击一些OTHER按钮从“选择器”中获取输入(JFileChoosers按钮(取消和选择)也被隐藏)。

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

    我希望作为Swing的新手,我缺少的另一个类可以做我所描述的事情,但它不会出现在我一直在制作的谷歌搜索中。

    3 回复  |  直到 12 年前
        1
  •  5
  •   Community holdenweb    7 年前

    example 延伸 JFileChooser 通过覆盖approve和cancel方法来直接处理选择。

    class MyChooser extends JFileChooser {
    
        @Override
        public void approveSelection() {
            ...
        }
    
        @Override
        public void cancelSelection() {
            ...
        }
    }
    
        2
  •  5
  •   MadProgrammer    12 年前

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

    问题是,摆脱 cancel okay 按钮。。。

    enter image description here

    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不喜欢对属性更改侦听器表现得很好。。。

    enter image description here

    毫无疑问,这是一个完整的破解。。。

    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 直接建立你自己的观点,但这比我现在有时间做的要多:(

        3
  •  2
  •   Philip Whitehouse    12 年前

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

    JFileChooser 是一个 对话 其被设计用于执行打开和保存内容。您可以更改按钮的名称,并可能删除“取消”。但你不能把它作为一个小组打开。

    然而,这是一个对话框,需要进行相当多的修改才能将其嵌入页面中。尽管来源是可用的,所以这是可能的。您可以重复使用 javax.swing.filechooser 类。