首页 > 代码库 > 第12章-Swing编程 --- 使用JFileChooser和Java7增强的JColorChooser

第12章-Swing编程 --- 使用JFileChooser和Java7增强的JColorChooser

第12章-Swing编程 --- 使用JFileChooser和Java7增强的JColorChooser

JColorChooser用于创建颜色选择器对话框,该类的用法非常简单,该类主要提供了如下两个静态方法:

-->showDialog(Component component,String title,Color initialColor):显示一个模式的颜色选择器对话框,该方法返回用户所选的颜色.其中component指定该对话框的parent组件,而title指定该对话框的标题.

-->createDialog(Component c,String title,boolean modal,JColorChooser chooserPane,ActionListener  okListener,ActionListener cancelListener): 该方法返回一个对话框,该对话框内包含指定的颜色选择器,该方法可以指定该对话框是模式的还是非模式的(通过modal参数指定)。

下面程序使用JColorChooser来弹出颜色选择器对话框:

import java.awt.Color;import java.awt.Dimension;import java.awt.Graphics;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.MouseMotionAdapter;import java.awt.image.BufferedImage;import javax.swing.JColorChooser;import javax.swing.JDialog;import javax.swing.JFrame;import javax.swing.JMenuItem;import javax.swing.JPanel;import javax.swing.JPopupMenu;public class HandDraw{    //画图区的宽度    private final int AREA_WIDTH = 500;    //画图区的高度    private final int AREA_HEIGHT = 400;    //下面的preX、preY保存了上一次鼠标拖动事件的鼠标坐标    private int preX = -1;    private int preY = -1;    //定义一个右键菜单用于设置画笔颜色    private JPopupMenu pop = new JPopupMenu();    private JMenuItem chooseColor = new JMenuItem("选择颜色");    //定义一个BufferedImage对象    BufferedImage image = new BufferedImage(AREA_WIDTH,AREA_HEIGHT,BufferedImage.TYPE_INT_ARGB);    //获取image对象的Graphics    Graphics g = image.getGraphics();    private JFrame f = new JFrame("简单手绘程序");    private DrawCanvas drawArea = new DrawCanvas();    //用于保存画笔颜色    private Color foreColor = new Color(255,0,0);        public void init()    {        chooseColor.addActionListener(new ActionListener()        {            @Override            public void actionPerformed(ActionEvent e)            {                //下面代码直接弹出一个模式的颜色选择对话框,并返回用户选择的颜色                //foreColor = JColorChooser.showDialog(f,"选择画笔颜色",foreColor);                //下面代码则弹出一个非模块的颜色选择对话框                //并可以分别为"确认"按钮、"取消"按钮指定事件监听器                final JColorChooser colorPane = new JColorChooser(foreColor);                JDialog jd = JColorChooser.createDialog(f, "选择画笔颜色", false, colorPane, new ActionListener(){                    @Override                    public void actionPerformed(ActionEvent e)                    {                        foreColor = colorPane.getColor();                    }                },null);                jd.setVisible(true);            }        });                //将菜单项组合成右键菜单        pop.add(chooseColor);        //将右键菜单添加到drawArea对象中        drawArea.setComponentPopupMenu(pop);        //将image对象的背景色填充成白色        g.fillRect(0, 0, AREA_WIDTH, AREA_HEIGHT);        drawArea.setPreferredSize(new Dimension(AREA_WIDTH,AREA_HEIGHT));        //监听鼠标移动动作        drawArea.addMouseMotionListener(new MouseMotionAdapter()        {            //实现按下鼠标键并拖动的事件处理器            public void mouseDragged(MouseEvent e)            {                //如果preX和preY大于0                if(preX > 0 && preY > 0)                {                    //设置当前颜色                    g.setColor(foreColor);                    //绘制从上一次鼠标拖动事件点到本次鼠标拖动事件点的线段                    g.drawLine(preX, preY, e.getX(), e.getY());                }                //将当前鼠标事件点的X、Y坐标保存起来                preX = e.getX();                preY = e.getY();                drawArea.repaint();            }        });                //监听鼠标事件        drawArea.addMouseListener(new MouseAdapter(){            //实现鼠标松开的事件处理器            public void mouseReleased(MouseEvent e)            {                //松开鼠标键时,把上一次鼠标拖动事件的X、Y坐标设为-1                preX = -1;                preY = -1;            }        });                f.add(drawArea);        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        f.pack();        f.setVisible(true);    }        public static void main(String[] args)    {        new HandDraw().init();    }        //让画图区域继承JPanel类    class DrawCanvas extends JPanel    {        //重写JPanel的paint方法,实现绘画        public void paint(Graphics g)        {            //将image绘制到该组件上            g.drawImage(image, 0, 0, null);        }    }}

 

 JFileChooser用于 "打开文件"、"保存文件"对话框:

  JFileChooser提供了多个构造器来创建JFileChooser对象,它的构造器总共包含了两个参数.

  (1)currentDirectory:指定所创建文件对话框的当前路径,该参数既可以是一个String类型的路径,也可以是一个File对象所代表的路径。

  (2)FileSystemView:用于指定基于该文件系统外观来创建文件对话框,如果没有指定该参数,则默认以当前文件系统外观创建文件对话框。

  

  JFileChooser并不是JDialog的子类,所以不能使用setVisible(true)方法来显示该文件对话框,而是调用showXXXDialog()方法来显示文件对话框。

  使用JFileChooser来建立文件对话框并允许用户选择文件的步骤如下:

  (1)采用构造器创建一个JFileChooser对象,该JFileChooser对象无须指定parent组件,这意味着可以在多个窗口中共用该JFileChooser对象。创建JFileChooser对象时可以指定初始化路径,如下代码所示:

  //以当前路径创建文件选择器

  JFileChooser chooser = new JFileChooser(".");

  (2)调用JFileChooser的一系列可选的方法对JFileChooser执行初始化操作.JFileChooser大致有如下几个常用方法:

    -->setSelectedFile/setSelectedFiles: 指定该文件选择器默认选中的文件(也可以默认选中多个文件)

    //默认选择当前路径下的123.jpg文件

    chooser.setSelectedFile(new File("123.jpg"));

    -->setMultiSelectionEnabled(boolean b):在默认情况下,该文件选择器只能选择一个文件,通过调用该方法可以设置允许选择多个文件(设置参数值为true即可)。

    -->setFileSelectionMode(int mode):在默认情况下,该文件选择器只能选择文件,通过调用该方法可以设置允许选择文件、路径、文件与路径,设置参数值为:JFileChooser.FILES_ONLY、JFileChooser.DIRECTORIES_ONLY、JFileChooser.FILES_AND_DIRECTORIES;

  (3)如果让文件对话框实现文件过滤功能,则需要结合FileFilter类进行文件过滤.JFileChooser提供了两个方法来安装文件过滤器:

    addChooserFileFilter(FileFilter filter):添加文件过滤器.通过该方法允许该文件对话框有多个文件过滤器。

      //为文件对话框添加一个文件过滤器

      chooser.addChoosableFileFilter(filter);

    setFileFilter(FileFilter filter):设置文件过滤器.一旦调用了该方法,将导致文件对话框只有一个文件过滤器。

  (4)调用showXXXDialog方法可以打开文件对话框,通常如下三个方法可用:

      int showDialog(Component parent,String approveButtonText):弹出文件对话框,该对话框的标题、"同意"按钮的文件由approveButtonText来指定。

      int showOpenDialog(Component parent):弹出文件对话框,该对话框具有默认标题,"同意"按钮的文件是"打开".

      int showSaveDialog(Component parent):弹出文件对话框,该对话框具有默认标题,"同意"按钮的文本是"保存"  

     下面程序举例一个简单的图片查看工具程序:

import java.awt.Dimension;import java.awt.Image;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.beans.PropertyChangeEvent;import java.beans.PropertyChangeListener;import java.io.File;import java.util.ArrayList;import javax.swing.BorderFactory;import javax.swing.Icon;import javax.swing.ImageIcon;import javax.swing.JFileChooser;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JMenu;import javax.swing.JMenuBar;import javax.swing.JMenuItem;import javax.swing.JScrollPane;import javax.swing.filechooser.FileFilter;import javax.swing.filechooser.FileView;public class ImageViewer{    //定义图片预览组件的大小    private final int PREVIEW_SIZE = 100;    private JFrame jf = new JFrame("简单图片查看器");    private JMenuBar menuBar = new JMenuBar();    //该Label用于显示图片    private JLabel label = new JLabel();    //以当前路径创建文件选择器    private JFileChooser chooser = new JFileChooser(".");    private JLabel accessory = new JLabel();    //定义文件过滤器    private ExtensionFileFilter filter = new ExtensionFileFilter();        public void init()    {        filter.addExtension("jpg");        filter.addExtension("jpeg");        filter.addExtension("gif");        filter.addExtension("png");        filter.setDescription("图片文件(*.jpg,*.jpeg,*.gif,*.png)");        chooser.addChoosableFileFilter(filter);                //禁止 "文件类型" 下拉列表中显示"所有文件" 选项        chooser.setAcceptAllFileFilterUsed(false);                //为文件选择器指定自定义的FileView对象        chooser.setFileView(new FileIconView(filter));                //为文件选择器指定一个预览图片的附件        chooser.setAccessory(accessory);                //设置预览图片组件的大小和边框        accessory.setPreferredSize(new Dimension(PREVIEW_SIZE,PREVIEW_SIZE));        accessory.setBorder(BorderFactory.createEtchedBorder());                //用于检测被选中文件的改变事件        chooser.addPropertyChangeListener(new PropertyChangeListener()        {            @Override            public void propertyChange(PropertyChangeEvent event)            {                //JFileChooser的被选文件已经发生了改变                if(event.getPropertyName() == JFileChooser.SELECTED_FILE_CHANGED_PROPERTY)                {                    //获取用户选择的新文件                    File f = (File)event.getNewValue();                                        if(f == null)                    {                        accessory.setIcon(null);                    }                                        //将所选文件读取ImageIcon对象中                    ImageIcon icon = new ImageIcon(f.getPath());                                        //如果图像太大,则缩小它                    if(icon.getIconWidth() > PREVIEW_SIZE)                    {                        icon = new ImageIcon(icon.getImage().getScaledInstance(PREVIEW_SIZE, -1, Image.SCALE_DEFAULT));                    }                                        //改变accessory Label的图标                    accessory.setIcon(icon);                }            }        });                //下面代码开始为该窗口安装菜单        JMenu menu = new JMenu("菜单");        menuBar.add(menu);        JMenuItem openItem = new JMenuItem("打开");        menu.add(openItem);        //单击openItem菜单项显示"打开文件"对话框        openItem.addActionListener(new ActionListener(){            @Override            public void actionPerformed(ActionEvent event)            {                //设置文件对话框的当前路径                //chooser.setCurrentDirectory(new File("."));                //显示文件对话框                int result = chooser.showDialog(jf, "打开图片文件");                //如果用户选择了APPROVE(同意)按钮,即打开,保存的等效按钮                if(result == JFileChooser.APPROVE_OPTION)                {                    String name = chooser.getSelectedFile().getPath();                    //显示指定图片                    label.setIcon(new ImageIcon(name));                }            }        });                JMenuItem exitItem = new JMenuItem("Exit");        menu.add(exitItem);        //为退出菜单绑定事件监听器        exitItem.addActionListener(new ActionListener()        {            @Override            public void actionPerformed(ActionEvent event)            {                System.exit(0);            }        });                jf.setJMenuBar(menuBar);        //添加用于显示图片的JLabel组件        jf.add(new JScrollPane(label));        jf.pack();        jf.setVisible(true);    }        public static void main(String[] args)    {        new ImageViewer().init();    }        }//创建FileFilter的子类,用以实现文件过滤功能class ExtensionFileFilter extends FileFilter{    private String description;    private ArrayList<String> extensions = new ArrayList<String>();    //自定义方法,用于添加文件扩展名    public void addExtension(String extension)    {        if(!extension.startsWith("."))        {            extension = "."+extension;            extensions.add(extension.toLowerCase());        }    }        //用于设置该文件过滤器的描述文本    public void setDescription(String description)    {        this.description = description;    }        @Override    public String getDescription()    {        return description;    }        @Override    public boolean accept(File f)    {        //如果该文件是路径,则接受该文件        if(f.isDirectory())        {            return true;        }                //将文件名转为小写(全部转为小写后比较,用于忽略文件名大小写)        String name = f.getName().toLowerCase();                //遍历所有可接受的扩展名,如果扩展名相同,该文件就可接受        for(String extension : extensions)        {            if(name.endsWith(extension))            {                return true;            }        }        return false;    }}//自定义一个FileView类,用于为指定类型的文件或文件夹设置图标class FileIconView extends FileView{    private FileFilter filter;        public FileIconView(FileFilter filter)    {        this.filter = filter;    }        //重写该方法,为文件夹、文件设置图标    @Override    public Icon getIcon(File f)    {        if(!f.isDirectory() && filter.accept(f))        {            return new ImageIcon("ico/pict.png");        }        else if(f.isDirectory())        {            //获取所有根路径            File[] fList = File.listRoots();            for(File tmp : fList)            {                //如果该路径是根路径                if(tmp.equals(f))                {                    return new ImageIcon("ico/dsk.png");                }            }                        return new ImageIcon("ic0/folder.png");        }        else        {            return null;        }    }}