JFileChooser总是在默认位置显示,并且大小总是确定的。当filechooser弹出后,如果用户修改了对话盒的位置和大小,我们希望对话盒下次弹出时能够“记住”上次的位置和大小。我在网上查了一下,似乎没有类似的解答,因此,我看了JFileChooser弹出对话盒的JDK代码,发现JFileChooser类中有一个createDialog方法,在这个方法中创建了要show出的对话盒。该方法是protected方法,因此可以被子类重载。
下面提供一个JFileChooser的子类——KFileChooser,该类能够定制对话盒show出的位置和大小,并且提供方法取得对话盒最后一次show出的位置和大小。最后给出一个测试KFileChooser的代码类,表明如何“记住”对话盒上次显示的位置和大小。
作者Email:king_jbx@sina.com.cn,欢迎各位网友一起交流经验。
import java.awt.Component;
import java.awt.Dimension;
import java.awt.HeadlessException;
import java.awt.Point;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
/**
* @author Jiang Baoxin
* Email: king_jbx@sina.com.cn
* Date: 2011-6-18
*/
public class KFileChooser extends JFileChooser
{
private Point p;
private Dimension d;
/**
* 见JFileChooser API的注释说明
* @param location 对话盒弹出的位置
* @param size 对话盒的大小
*/
public int showOpenDialog(Component parent,
Point location, Dimension size) throws HeadlessException {
p = location;
d = size;
return super.showOpenDialog(parent);
}
/**
* 见JFileChooser API的注释说明
* @param location 对话盒弹出的位置
* @param size 对话盒的大小
*/
public int showSaveDialog(Component parent,
Point location, Dimension size) throws HeadlessException {
p = location;
d = size;
return super.showSaveDialog(parent);
}
/**
* 见JFileChooser API的注释说明
* @param location 对话盒弹出的位置
* @param size 对话盒的大小
*/
public int showDialog(Component parent, String approveButtonText,
Point location, Dimension size){
p = location;
d = size;
return super.showDialog(parent, approveButtonText);
}
/**
* 取得对话盒的位置和大小,结果放在参数中,要求参数不是null
* @param p 记录对话盒的位置
* @param d 记录对话盒的大小
*/
public void getLastLocationAndSize(Point p, Dimension d){
if (p != null){
p.x = this.p.x;
p.y = this.p.y;
}
if (d != null){
d.width = this.d.width;
d.height = this.d.height;
}
}
protected JDialog createDialog(Component parent) throws HeadlessException {
final JDialog dlg = super.createDialog(parent);
dlg.addComponentListener(new ComponentAdapter(){
public void componentMoved(ComponentEvent e) {
p = dlg.getLocation();
}
public void componentResized(ComponentEvent e) {
d = dlg.getSize();
}
});
if (p != null)
dlg.setLocation(p);
if (d != null && d.width > 0 && d.height > 0)
dlg.setSize(d);
return dlg;
}
}
import java.awt.Dimension;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
public class TestKFileChooser
{
Point p; //保存对话盒上次弹出的位置
Dimension d; //保持对话盒上次的大小
TestKFileChooser(){
final JFrame frame = new JFrame("Test KFileChooser");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton btn = new JButton("Show open dialog");
frame.getContentPane().add(btn);
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
showOpenDlg(frame);
}
});
frame.pack();
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((d.width - frame.getWidth()) / 2, (d.height - frame.getHeight()) / 2);
frame.setVisible(true);
}
private void showOpenDlg(JFrame frame){
KFileChooser chooser = new KFileChooser();
//设置对话盒的位置和大小
int result = chooser.showOpenDialog(frame, p, d);
if (p == null) p = new Point();
if (d == null) d = new Dimension();
//保存对话盒的位置和大小
chooser.getLastLocationAndSize(p, d);
System.out.println("the selected file is " + chooser.getSelectedFile());
}
public static void main(String[] args) {
new TestKFileChooser();
}
}