首页 > 代码库 > 第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; } }}