猿问

嵌入 JFileChooser

我正在尝试添加一个JFileChooser选择父目录并允许用户输入文件名的文件。我知道showSaveDialog和showOpenDialog方法,但是我不想创建一个新窗口。


这是我到目前为止所拥有的:


public class BrowserTest extends JFrame {


    private JPanel contentPane;


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            public void run() {

                try {

                    BrowserTest frame = new BrowserTest();

                    frame.setVisible(true);

                } catch (Exception e) {

                    e.printStackTrace();

                }

            }

        });

    }

    public BrowserTest() {

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setBounds(100, 100, 450, 300);

        contentPane = new JPanel();

        contentPane.setLayout(new BorderLayout(0, 0));

        setContentPane(contentPane);

        JFileChooser browser = new JFileChooser();

        browser.setFileFilter(new FileFilter() {

            @Override

            public String getDescription() {

                return "A .extension file";

            }

            @Override

            public boolean accept(File f) {

                return f.isDirectory();

            }

        });

        browser.setDialogType(JFileChooser.SAVE_DIALOG);

        browser.setSelectedFile(new File("*.extension"));

        browser.addActionListener(new ActionListener() {

            @Override

            public void actionPerformed(ActionEvent e) {

                final String action = e.getActionCommand();

                if(action.equals(JFileChooser.APPROVE_SELECTION)) {

                    System.out.println("trigger");

                    File f = browser.getCurrentDirectory();

                    System.out.println(f);


System.out.println("trigger");出于某种原因,只有在我选择文件时按下保存按钮才会执行。有没有办法直接监听保存按钮的按下?


忽然笑
浏览 140回答 3
3回答

紫衣仙女

您可以使用以下代码访问文件选择器的默认按钮,然后将您自己的侦听器添加到该按钮:JButton defaultButton = browser.getUI().getDefaultButton(browser);

30秒到达战场

如前所述,一种解决方案是递归地遍历 JFileBrowser 的组件,直到找到正确的组件,这里是一个带有操作命令字符串“Open”的 JButton。例如,此方法可能有效:public static void recursiveComponentSearch(Component c, String actionCommand,        ActionListener listener) {    if (c instanceof JButton) {        JButton button = (JButton) c;        // TODO: delete the line below        System.out.printf("Text: \"%s\";  action command: \"%s\"%n", button.getText(),                button.getActionCommand());        if (button.getActionCommand().equalsIgnoreCase(actionCommand)) {            button.addActionListener(listener);        }    }    // recursive search here    if (c instanceof Container) {        Container container = (Container) c;        Component[] components = container.getComponents();        for (Component component : components) {            recursiveComponentSearch(component, actionCommand, listener);        }    }}像这样使用:ActionListener listener = evt -> System.out.println("Save button here");String actionCommand = "Open";recursiveComponentSearch(browser, actionCommand, listener);

烙印99

我才发现问题出在线路上browser.setSelectedFile(new File("*.extension"));。显然,这种方法不喜欢星号,将其替换为其他任何东西都可以解决问题。例如:browser.setSelectedFile(new File("new.extension"));将按预期工作。
随时随地看视频慕课网APP

相关分类

Java
我要回答