检测 JFileChooser 何时关闭

Detect when JFileChooser has been closed

JFileChooser has a method addActionListener which accepts an ActionListener 当用户按下 JFileChooser window 底部的两个按钮之一时调用。但是,正如我发现的那样,当用户通过单击选择器 window 标题栏中的关闭按钮(或使用 OS 关闭它)。所以我的问题是:在这种情况下,JFileChooser 的创建者如何识别它何时关闭?

你是这个意思吗:

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
}

结合showOpenDialog(), you can add an 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[…]

JFileChooser 扩展 JComponent. So if you want to use it asynchronously instead of invoking showDialog and letting the rest of the UI freeze, you can embed the JFileChooser in a regular JFrame or any other Component as it is done 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);
    }
}