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