检测 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);
}
}
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);
}
}