检测JFileChooser何时关闭

时间:2015-11-01 15:40:08

标签: java swing jfilechooser

JFileChooser有一个方法addActionListener,它接受​​ActionListener,当用户按下JFileChooser窗口底部的两个按钮之一时,会调用该EasyPHP。但是,正如我发现的那样,当用户通过单击选择器窗口标题栏中的关闭按钮(或使用操作系统的其他方法关闭它)来关闭JFileChooser时,不会调用它。所以我的问题是:JFileChooser的创建者在这种情况下如何识别?{/ p>

3 个答案:

答案 0 :(得分:5)

你的意思是这样的:

JFileChooser fileChooser = new JFileChooser();
fileChooser.setCurrentDirectory(new File(System.getProperty("user.home")));
int result = fileChooser.showOpenDialog(null);
if (result == JFileChooser.APPROVE_OPTION) {
    File selectedFile = fileChooser.getSelectedFile();
    // select file      
} else if (result == JFileChooser.CANCEL_OPTION) {
    // file chooser closed
}

答案 1 :(得分:3)

结合showOpenDialog()返回的结果,您可以添加AncestorListener并实施ancestorRemoved()

代码:

JFileChooser chooser = new JFileChooser();
chooser.addAncestorListener(new AncestorListener() {

    @Override
    public void ancestorAdded(AncestorEvent e) {}

    @Override
    public void ancestorRemoved(AncestorEvent e) {
        System.out.println(e);
    }

    @Override
    public void ancestorMoved(AncestorEvent e) {}
});

控制台:

javax.swing.event.AncestorEvent[] on javax.swing.JFileChooser[…]

答案 2 :(得分:0)

JFileChooser延伸JComponent。因此,如果您想异步使用它而不是调用showDialog并让其余的UI冻结,您可以将JFileChooser嵌入到常规JFrame或任何其他Component中完成后here

然后,您可以收听JFrame的近似事件。小示威:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;

import javax.swing.JFileChooser;
import javax.swing.JFrame;

public class Demo {
    public static void main(String[] args) {
            JFrame frame = new JFrame("Select file");
            frame.setSize(400, 300);
            // disable default close behaviour of JFrame
            frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

            JFileChooser chooser = new JFileChooser();
            frame.add(chooser, BorderLayout.CENTER);

            // little helper to close the JFrame properly
            Runnable closeFrame = () -> {
                frame.setVisible(false);
                frame.dispose();
            };

            chooser.addActionListener((ActionEvent e) -> {
                if (e.getActionCommand() ==
                        JFileChooser.APPROVE_SELECTION) {
                    closeFrame.run();
                    System.out.println("User pressed approve button.");
                    File selectedFile = chooser.getSelectedFile();
                } else if (e.getActionCommand() ==
                        JFileChooser.CANCEL_SELECTION) {
                    closeFrame.run();
                    System.out.println("User pressed cancel button.");
                }
            });

            frame.addWindowListener(new WindowAdapter() {

                @Override
                public void windowClosing(WindowEvent e) {
                    // You could tell the user here
                    // that he has to select a file…
                    closeFrame.run();
                    System.out.println("User closed JFrame.");
                }
            });

            frame.setVisible(true);
    }
}