定制JFileChooser弹出的位置和大小

      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();

    }

} 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值