第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;
        }
    }
}

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

第12章-Swing编程 --- 使用JFileChooser和Java7增强的JColorChooser,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。