JFileChoose 保存对话框

13-1-2:建立可选择文件类型的JFileChooser对话框:
    当你专为某种文件类型设计一套软件时,为了用户打开文件存盘方便,我们通常会在文件对话框中过滤掉无关的文件类型,让用户
很快速选择出想要的文件数据.例如在Word软件中,当我们按下"另存新文件"选项时,所出现的文件对话框将会以".doc"扩展名当作默
认的文件存储类型.
    如果你所设计的软件可以支持多种类型的文件操作,你应该设计让用户可以选择使用哪一种类型的文件.
    若你想在java的文件对话框中做到这样的功能,你必须实现FileFilter这个抽象类.此抽象类里面定义了两个空的方法,分别是
accept(File f)与getDescripton().当目录里的文件与设置的文件类型相符时,accept()方法就会返回true,并将此文件显示在文件
对话框中.而getDescription()方法则是对此文件类型的描述,可由程序设计者自定义,如"*.java"等等.要设置选择文件类型对话框
你可以使用JFileChooser的addChoosableFileFilter()方法或是setFileFilter()方法.下面这个例子我们实现FileFilter的功能,让
用户打开文件时可以选择显示所有文件,或是*.java文件,亦或是*.class文件.

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;//由于我们在程序中要使用到File与FileFilter对象,因此要import File与FileFilter这两个类.
import javax.swing.filechooser.FileFilter;

public class FileFilterDemo implements ActionListener{
  JFrame f=null;
  JLabel label=null;
  JFileChooser fileChooser=null;
  public FileFilterDemo(){
     f=new JFrame("FileFilterDemo");   
     Container contentPane=f.getContentPane();
    
     JButton b=new JButton("打开文件");
     b.addActionListener(this);
    
     label=new JLabel(" ",JLabel.CENTER);
     label.setPreferredSize(new Dimension(150,30));
     contentPane.add(label,BorderLayout.CENTER);
     contentPane.add(b,BorderLayout.SOUTH);
    
     f.pack();
     f.setVisible(true);
     f.addWindowListener(new WindowAdapter(){
         public void windowClosing(WindowEvent e){
           System.exit(0);   
         }        
     });
  }   
  public static void main(String[] args){
        new FileFilterDemo();
  }
  //处理用户按下"打开旧文件"按钮事件.
  public void actionPerformed(ActionEvent e){
       fileChooser=new JFileChooser("C://winnt");//以c://winnt为打开文件为对话框的默认路径
      //利用addChoosableFileFilter()方法加入欲过滤的文件类型,使用addChoosableFileFilter()可以加入多种文件类型,
      //若你只需要过滤出一种文件类型,可使用setFileFilter()方法.
       fileChooser.addChoosableFileFilter(new JAVAFileFilter("class"));
       fileChooser.addChoosableFileFilter(new JAVAFileFilter("java"));
       int result=fileChooser.showOpenDialog(f);
       if (result==JFileChooser.APPROVE_OPTION){
         File file=fileChooser.getSelectedFile();
         label.setText("你选择了:"+file.getName()+"文件");            
       }else if (result==fileChooser.CANCEL_OPTION){
           label.setText("你没有选取文件");
       }
  }
}
//以JAVAFileFilter类继承FileFilter抽象类,并实现accept()与getDescription()方法.
class JAVAFileFilter extends FileFilter{
    String ext;
    public JAVAFileFilter(String ext){
        this.ext=ext;   
    }   
   /*在accept()方法中,当程序所抓到的是一个目录而不是文件时,我们返回true值,表示将此目录显示出来.*/
    public boolean accept(File file){
      if (file.isDirectory()){
         return true;   
      }   
      String fileName=file.getName();
      int index=fileName.lastIndexOf('.');
      if (index>0 && index<fileName.length()-1){
            //表示文件名称不为".xxx"现"xxx."之类型
            String extension=fileName.substring(index+1).toLowerCase();
          //若所抓到的文件扩展名等于我们所设置要显示的扩展名(即变量ext值),则返回true,表示将此文件显示出来,否则返回
          //true.
            if (extension.equals(ext))
              return true;
      }
      return false;
    }
    //实现getDescription()方法,返回描述文件的说明字符串!!!
    public String getDescription(){
        if (ext.equals("java"))
            return "JAVA Source File(*.java)";
        if (ext.equals("class"))
            return "JAVA Class File(*.class)";
        return "";
    }
}

13-1-3:建立具有特殊文件类型的图标的JFileChooser:
     在上个范例中,读者可以发现若你选择显示所有文件时,文件类型图标不会因扩展名的不同而有所区别,这样可能造成用户混淆
或是使用上的不方便.
     要解决这个问题,你必须再实现FileView这个抽象类,此抽象类定义了5个空的方法,如下表所示:
FileView方法:
String    getDescription(File f):返回对这个文件的描述,如这是一张风景图片等.
Icon      getIcon(File f):返回文件Icon图标.
String    getName(File f):返回文件名.
String    getTypeDescription(File f):返回文件类型描述,如:"JAVA Source File"等等.
Boolean   isTraversable(File f):返回目录是否可浏览.
    当你实现好这5个方法后,就可以利用JFileChooser的setFileView()方法来设置文件类型图标.我们来看下面的范例:

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.filechooser.*;

public class FileIconFilterDemo implements ActionListener
{
    JFrame f = null;
    JLabel label = null;
    JFileChooser fileChooser = null;
   
    public FileIconFilterDemo()
    {
        f = new JFrame("FileIconFilter Demo");
        Container contentPane = f.getContentPane();
       
        JButton b = new JButton("打开文件");
        b.addActionListener(this);
       
        label = new JLabel(" ",JLabel.CENTER);
        label.setPreferredSize(new Dimension(150,30));
        contentPane.add(label,BorderLayout.CENTER);
        contentPane.add(b,BorderLayout.SOUTH);
       
        f.pack();
        f.setVisible(true);
       
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }   
   
    public static void main(String[] args)
    {
        new FileIconFilterDemo();
    }
   
    public void actionPerformed(ActionEvent e)
    {
        fileChooser = new JFileChooser("c://winnt");
        fileChooser.addChoosableFileFilter(new JAVAFileFilter("class"));
        fileChooser.addChoosableFileFilter(new JAVAFileFilter("java"));
        fileChooser.setFileView(new FileIcon());
        int result = fileChooser.showOpenDialog(f);
        if(result == JFileChooser.APPROVE_OPTION)
        {
            File file = fileChooser.getSelectedFile();
            label.setText("您选择了:"+file.getName()+"文件");
        }else if (result == fileChooser.CANCEL_OPTION){
            label.setText("您没有选择任何文件");
        }
    }
}

class JAVAFileFilter extends FileFilter
{
    String ext;
   
    public JAVAFileFilter(String ext)
    {
        this.ext = ext;
    }
   
    public boolean accept(File file)
    {
        if (file.isDirectory())
            return true;
       
        String fileName = file.getName();
        int index = fileName.lastIndexOf('.');

        if (index > 0 && index < fileName.length()-1) {
            String extension = fileName.substring(index+1).toLowerCase();
            if (extension.equals(ext))
                return true;
        }
        return false;
    }
   
    public String getDescription(){
        if (ext.equals("java"))
            return "JAVA Source File (*.java)";
        if (ext.equals("class"))
            return "JAVA Class File (*.class)";
        return "";
    }
}

class FileIcon extends FileView
{
    public String getName(File f) {
        return null; //返回值为null的话,java look and feel功能会处理掉这个项目,并取得相关值来加以设置.
                     //一般而言可以使用f.getName()当返回值.
    }

    public String getDescription(File f) {
        return null; //返回值为null的话,java look and feel功能会处理掉这个项目,并取得相关值来加以设置.
                     //你也可以自己设置对此图片的描素,如这是一张风景图片等等.
    }

    public String getTypeDescription(File f)
    {
        String extension = getExtensionName(f);
        if(extension.equals("java"))
            return "JAVA Source File";
        if(extension.equals("class"))
            return "JAVA Class File";
        return "";
    }

    public Icon getIcon(File f)
    {
        String extension = getExtensionName(f);
        if(extension.equals("java"))
            return new ImageIcon("java.gif");
        if(extension.equals("class"))
            return new ImageIcon("class.gif");
        return null;
    }

    public Boolean isTraversable(File f) {
        return null; //返回值为null的话,java look and feel功能会处理掉这个项目,并取得相关值来加以设置.
                     //若佻不希望某个目录被浏览,则返回值可以设为Boolean.FALSE.
    }
   
    public String getExtensionName(File f)//在FileIcon类中我们增加一个getExtensionName()方法,用来返回文件的扩展名
    {                                      //名称.
         String extension ="";
        String fileName = f.getName();
        int index = fileName.lastIndexOf('.');

        if (index > 0 && index < fileName.length()-1) {
            extension = fileName.substring(index+1).toLowerCase();
        }
        return extension;
    }
}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值