12.2.6 使用JFileChoose和Java7增强的JColorChooser JColorChooser
JColorChooser
用于创建颜色选择器对话框,该类的用法非常简单,该类主要提供了如下两个静态方法
方法
描述
JColorChooser()
Creates a color chooser pane with an initial color of white.
JColorChooser(Color initialColor)
Creates a color chooser pane with the specified initial color.
JColorChooser(ColorSelectionModel model)
Creates a color chooser pane with the specified ColorSelectionModel.
showDialog( Component component, String title, Color initialColor)
:
方法
描述
static Color showDialog(Component component, String title, Color initialColor)
显示一个模式的颜色选择器对话框,该方法返回用户所选颜色。其中component
指定该对话框的parent
组件,而title
指定该对话框的标题,大部分时候都使用该方法来让用户选择颜色。
static Color showDialog(Component component, String title, Color initialColor, boolean colorTransparencySelectionEnabled)
Shows a modal color-chooser dialog and blocks until the dialog is hidden.
static JDialog createDialog(Component c, String title, boolean modal, JColorChooser chooserPane, ActionListener okListener, ActionListener cancelListener)
该方法返回一个对话框,该对话框内包含指定的颜色选择器,该方法可以指定该对话框是模式的还是非模式的(通过modal
参数指定),还可以指定该对话框内“确定”按钮的事件监听器(通过okListener
参数指定)和“取消”按钮的事件监听器(通过cancelListener
参数指定)。
Java7
为JColorChooser
增加了一个HSV
标签页,允许用户通过HSV
模式来选择颜色。
程序 JColorchooser
颜色选择器 下面程序改写了前一章的HandDraw
程序,改为使用JPanel
作为绘图组件,而且使用JColorchooser
来弹出颜色选择器对话框。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 import java.awt.*;import java.awt.image.*;import java.awt.event.*;import javax.swing.*;public class HandDraw { private final int AREA_WIDTH = 500 ; private final int AREA_HEIGHT = 400 ; private int preX = -1 ; private int preY = -1 ; JPopupMenu pop = new JPopupMenu (); JMenuItem chooseColor = new JMenuItem ("选择颜色" ); BufferedImage image = new BufferedImage (AREA_WIDTH, AREA_HEIGHT, BufferedImage.TYPE_INT_RGB); 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(ae -> { final JColorChooser colorPane = new JColorChooser (foreColor); JDialog jd = JColorChooser.createDialog(f, "选择画笔颜色" , false , colorPane, e -> foreColor = colorPane.getColor(), null ); jd.setVisible(true ); }); pop.add(chooseColor); drawArea.setComponentPopupMenu(pop); 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) { if (preX > 0 && preY > 0 ) { g.setColor(foreColor); g.drawLine(preX, preY, e.getX(), e.getY()); } preX = e.getX(); preY = e.getY(); drawArea.repaint(); } }); drawArea.addMouseListener(new MouseAdapter () { public void mouseReleased (MouseEvent e) { 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(); } class DrawCanvas extends JPanel { private static final long serialVersionUID = -3097175472553624890L ; public void paint (Graphics g) { g.drawImage(image, 0 , 0 , null ); } } }
上面程序分别使用了两种方式来弹出颜色选择对话框,其中1号代码 可弹出一个模式的颜色选择对话框,并直接返回用户选择的颜色。这种方式简单明了,编程简单。 如果程序有更多额外的需要,则使用程序2号代码 ,弹出一个非模式的颜色选择对话框(允许程序设定),并为“确定”按钮指定了事件监听器,而“取消”按钮的事件监听器为null
(也可以为该按钮指定事件监听器)。Swing
的颜色选择对话框如图12.8所示:
从图12.8中可以看出,Swing
的颜色选择对话框提供了5种方式来选择颜色,图中显示了HSV
方式、CMYK
方式的颜色选择器,除此之外,该颜色选择器还可以使用RGB
、HSL
方式来选择颜色。
在Java6
时,ColorChooser
只提供了三种颜色选择方式,图12.8中看到的HSV
、CMYK
两种颜色选择方式都是新增的。
JFileChooser JFileChooser
的功能与AWT
中的FileDialog
基本相似,也是用于生成“打开文件”、“保存文件”对话框;与FileDialog
不同的是,JFileChooser
无须依赖于本地平台的GUI
,它由100%纯Java
实现,在所有平台上具有完全相同的行为,并可以在所有平台上具有相同的外观风格。
构造器 为了调用JFileChooser
来打开一个文件对话框,必须先创建该对话框的实例,JFileChooser
提供了多个构造器来创建JFileChooser
对象,它的构造器总共包含两个参数。
方法
描述
JFileChooser()
Constructs a JFileChooser pointing to the user’s default directory.
JFileChooser(File currentDirectory)
Constructs a JFileChooser using the given File as the path.
JFileChooser(File currentDirectory, FileSystemView fsv)
Constructs a JFileChooser using the given current directory and FileSystemView.
JFileChooser(String currentDirectoryPath)
Constructs a JFileChooser using the given path.
JFileChooser(String currentDirectoryPath, FileSystemView fsv)
Constructs a JFileChooser using the given current directory path and FileSystemView.
JFileChooser(FileSystemView fsv)
Constructs a JFileChooser using the given FileSystemView.
currentDirectory
:指定所创建文件对话框的当前路径currentDirectoryPath
:指定所创建文件对话框的当前路径FileSystemView
:用于指定基于该文件系统外观来创建文件对话框,如果没有指定该参数,则默认以当前文件系统外观创建文件对话框。
显示隐藏文件对话框 JFileChooser
并不是JDialog
的子类,所以不能使用setVisible(true)
方法来显示该文件对话框,而是调用showXxxDialog()
方法来显示文件对话框
建立文件对话框 步骤 使用JFileChooser
来建立文件对话框并允许用户选择文件的步骤如下。
创建JFileChooser
对象
采用构造器创建一个JFileChooser
对象,该JFileChooser
对象无须指定parent
组件,这意味着可以在多个窗口中共用该JFileChooser
对象。创建JFileChooser
对象时可以指定初始化路径,如下代码所示。
1 2 JFileChooser chooser = new JFileChooser ("." );
对JFileChooser
执行初始化操作
调用JFileChooser
的一系列可选的方法对JFileChooser
执行初始化操作。JChooser
大致有如下几个常用方法。
指定默认选择的文件
方法
描述
void setSelectedFile(File file)
指定该文件选择器默认选择的文件
void setSelectedFiles(File[] selectedFiles)
指定该文件选择器默认选择多个文件
例如:
1 2 chooser.setSelectedFile(new File ("123.jpg" ));
设置选择模式
方法
描述
void setFileSelectionMode(int mode)
在默认情况下,该文件选择器只能选择文件,通过调用该方法可以设置允许选择文件、路径、文件与路径,mode
参数可以设置为:JFileChooser.FILES_ONLY
、JFileChooser.DIRECTORIES_ONLY
、JFileChooser.FILES_AND_DIRECTORIES
例如
1 2 chooser.setFileselectionMode (JFileChooser.FILES_AND_DIRECTORIES);
设置文件过滤器 如果让文件对话框实现文件过滤功能,则需要结合FileFilter
类来进行文件过滤。JFileChooser
提供了两个方法来安装文件过滤器。
方法
描述
void addChoosableFileFilter(FileFilter filter)
添加文件过滤器。通过该方法允许该文件对话框有多个文件过滤器。
void setFileFilter(FileFilter filter)
设置文件过滤器。一旦调用了该方法,将导致该文件对话框只有个文件过滤器。
设置文件视图 如果需要改变文件对话框中文件的视图外观,则可以结合FileView
类来改变对话框中文件的视图外观。
打开文件对话框 调用showXxxDialog
方法可以打开文件对话框,通常如下三个方法可用。
方法
描述
int showDialog(Component parent, String approveButtonText)
弹出文件对话框,该对话框的标题“同意”按钮的文本(默认是“保存”或“取消”按钮)由approveButtonText
来指定。
int showOpenDialog(Component parent)
弹出文件对话框,该对话框具有默认标题,“同意”按钮的文本是“打开”。
int showSaveDialog(Component parent)
弹出文件对话框,该对话框具有默认标题,“同意”按钮的文本是“保存”。
当用户单击“同意”、“取消”按钮,或者直接关闭文件对话框时才可以关闭该文件对话框,关闭该对话框时返回一个int
类型的值,分别是:JFileChooser.APPROVE_OPTION
、JFileChooser.CANCEL_OPTION
、JFileChooser.ERROR_OPTION
。
如果希望获得用户选择的文件,则通常应该先判断对话框的返回值是否为JFileChooser.APPROVE_OPTION
,该选项表明用户单击了“打开”或者“保存”按钮
获取用户选择的文件 JFileChooser
提供了如下两个方法来获取用户选择的文件或文件集。
方法
描述
File getSelectedFile()
返回用户选择的文件。
File[] getSelectedFiles()
返回用户选择的多个文件。
按上面的步骤,就可以正常地创建一个“打开文件”、“保存文件”对话框,整个过程非常简单。如果要使用FileFilter
类来进行文件过滤,或者使用FileView
类来改变文件的视图风格,则有一点麻烦。
FileFilter类 先看使用FileFilter
类来进行文件过滤。Java
在java.io
包下提供了一个FileFilter
接口,该接口主要用于作为File
类的listFiles(FileFilter)
方法的参数,也是一个进行文件过滤的接口。但此处需要使用位于javax.swing.Filechooser
包下的FileFilter
抽象类,该抽象类包含两个抽象方法。
方法
描述
abstract boolean accept(File f)
判断该过滤器是否接受给定的文件,只有被该过滤器接受的文件才可以在对应的文件对话框中显示出来。
abstract String getDescription()
返回该过滤器的描述性文本。
如果程序要使用FileFilter
类进行文件过滤,则通常需要扩展该FileFilter
类,并重写该类的两个抽象方法,重写accept()
方法时就可以指定自己的业务规则,指定该文件过滤器可以接受哪些文件。
例如如下代码:
1 2 3 4 5 6 7 8 9 public boolean accept (File f) { if (f.isDirectory()) return true ; if (f.getName().endswith(".gif" )) return true ; return false ; }
在默认情况下,JFileChooser
总会在文件对话框的“文件类型”下拉列表中增加“所有文件”选项,但可以调用JFileChooser
的setAcceptAllFileFilterUsed(false)
来取消显示该选项
方法
描述
void setAcceptAllFileFilterUsed(boolean b)
Determines whether the AcceptAll FileFilter is used as an available choice in the choosable filter list.
FileView
类FileView
类用于改变文件对话框中文件的视图风格 ,FileView
类也是一个抽象类,通常程序需要扩展该抽象类,并有选择性地重写它所包含的如下几个抽象方法。
方法
描述
String getDescription(File f)
返回指定文件的描述
Icon getIcon(File f)
返回指定文件在FIleChooser
对话框中的图标
String getName(File f)
返回指定文件的文件名
String getTypeDescription(File f)
返回指定文件所属文件类型的描述
Boolean isTraversable(File f)
当该文件是目录时,返回该目录是否是可遍历的
与重写FileFilter
抽象方法类似的是,重写这些方法实际上就是为文件选择器对话框指定自定义的外观风格。通常可以通过重写getlcon()
方法来改变文件对话框中的文件图标。
程序示例 下面程序是一个简单的图片查看工具程序,该程序综合使用了上面所介绍的各知识点。
上面程序中为“打开”菜单项指定事件监听器,当用户单击该菜单时,程序打开文件对话框,并将用户打开的图片文件使用Label
在当前窗口显示出来。 重写了FileFilter
类的accept()
方法,该方法根据文件后缀来决定是否接受该文件,其要求是当该文件的后缀等于该文件过滤器的extensions
集合的某一项元素时,则该文件是可接受的。 程序的①处代码禁用了JFileChooser
中“所有文件”选项,从而让用户只能看到图片文件。
第四段粗体字代码用于重写FileView
类的getlcon()
方法,该方法决定JFileChooser
对话框中文件文件夹的图标——图标文件就返回pict.Png
图标,根文件夹就返回dsk.Png
图标,而普通文件夹则返回folder.png
图标 运行上面程序,单击“打开”菜单项,将看到如图12.9所示的对话框
图省略…
上面程序中的②处粗体字代码还用了JFileChooser
类的setAccessory(JComponent new Accessory)
方法为该文件对话框指定附件,附件将会被显示在文件对话框的右上角,如图12.9所示。该附件可以是任何Swing
组件(甚至可以使用容器),本程序中使用一个JLabe
组件作为该附件组件,该JLabel
用于显示用户所选图片文件的预览图片。该功能的实现很简单:当用户选择的图片发生改变时,以用户所选文件创建ImageIcon
,并将该ImageIcon
设置成该Label
的图标即可。
监听用户选择文件的变化 为了实现当用户选择图片发生改变时,附件组件的icon
随之发生改变的功能,必须为JFileChooser
添加事件监听器,该事件监听器负责监听该对话框中用户所选择文件的变化 。JComponent
类中提供了个addPropertyChangeListener
方法,该方法可以为该JFileChooser
添加一个属性监听器,用于监听用户选择文件的变化。程序中第一段粗体字代码实现了用户选择文件发生改变时的事件处理器。