文件选择对话框,颜色选择对话框,分隔线的使用与介绍 ++ Swing程序设计 ++ JFileChoose,JColorChooer,JSeparator 文件选择对话框,颜色选择对话框,分隔线的使用与介绍. 13-1:使用JFileChooser组件. JFileChooser的类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container --javax.swing.JComponent --javax.swing.JFileChooser 当我们在处理窗口上的一些操作,特别是文本处理的部份,例如一个文本编辑器上打了一段文字,我们可能希望将此段文字存储起来 ,供以后方便使用,此时系统应当提供一个存储文件的对话框,将此段文字存到一个自定义或内定的文件名中.同样,当我们要叫出某个 文件时,系统也应当提供打开文件的功能,让我们选择所欲打开的文件.在java中这些操作都可以由JFileChoose组件来达成.这个组件 提供了打开文件存盘的窗口功能,也提供了显示特定类型文件图标的功能,亦能针对某些文件类型做过滤的操作.如果你的系统需要对 某些文件或文件做操作,JFileChooser组件可以让你轻松地做出漂亮的用户界面.在这边读者要注意的是,JFileChooser本身不提供读 文件或存盘的功能,这些功能必须你自行实作.事实上,JFileChooser本身只是一个对话框模型,它也是依附在JDialog的结构上,因此 它只是一个针对文件操作的对话框,当然本身也就不会有读文件或存盘的功能!以下我们来看JFileChooser的构造函数: JFileChooser构造函数: JFileChooser():建立一个JFileChooser对象,默认的文件对话框路径是用户的家目录(Home Directory),例如在windows 2000中的 Administrator的家目录是在C:\Documents and Settings\Administrator中. JFileChooser(File currentDirectory):建立一个JFileChooser对象,并以File所在位置文件为文件对话框的打开路径. JFileChooser(File currentDirectory,FileSystemView fsv):建立一个JFileChooser对象,以File所在位置为文件对话框的打开路 径并设置文件图标查看方式. JFileChooser(FileSystemView fsv):建立一个JFileChooser对象,并设置文件图标查看方式. JFileChooser(String currentDirectoryPath):建立一个JFileChooser对象,并设置文件对话框的打开路径. JFileChooser(String currentDirectoryPath,FileSystemView fsv): 建立一个JFileChooser对象,并设置文件对话框的打开路径与 文件图标查看方式. 13-1-1:建立一个简单的JFileChooser对话框: 介绍完JFileChooser构造函数后,我们来实作一个简单的范例.这个范例可以让用户在JTextArea上输入文字,输入完后按下"存储 文件"按钮就可以打开JFileChooser存储文件对话框,用户可以输入欲存储的文件名,按下"Save"按钮就可以存储文件.若用户要打开 某个文件内容,只需要按下"打开文件"按钮,就会出现JFileChooser打开文件对话框,用户选择好所欲打开的文件就可以将数据读入 JTextArea中. 在这个范例中,我们使用JFileChooser的showOpenDialog()或showSaveDialog()方法来打开文件对话框,此两个方法在用户按下 按钮或关闭对话框时会返回一个整数值,这个整数值的类型有3种,分别是: JFileChooser.CANCEL_OPTION:表示用户按下取消按钮. JFileChooser.APPROVE_OPTION:表示用户按下确定按钮. JFileChooser.ERROR_OPEION:表示有错误产生或是对话框不正常关闭. 利用这3个整数值我们就能判断用户到底在对话框中做了什么操作,并加以处理,例如当用户选择了文件并按下确定键后,我们就可 以利用getSelectedFile()方法取得文件对象,利用这个文件对象我们就能够取得文件名称(getName())与文件路径(getPath()); import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.io.*; class FileChooserDemo1 implements ActionListener { JFrame f = null; JLabel label = null; JTextArea textarea = null; JFileChooser fileChooser = null; public FileChooserDemo1() { f = new JFrame("FileChooser Example"); Container contentPane = f.getContentPane(); textarea = new JTextArea(); JScrollPane scrollPane = new JScrollPane(textarea); scrollPane.setPreferredSize(new Dimension(350,300)); JPanel panel = new JPanel(); JButton b1 = new JButton("新建文件"); b1.addActionListener(this); JButton b2 = new JButton("存储文件"); b2.addActionListener(this); panel.add(b1); panel.add(b2); label = new JLabel(" ",JLabel.CENTER); fileChooser = new JFileChooser("D:\\");//建立一个FileChooser对象,并指定D:的目录为默认文件对话框路径. contentPane.add(label,BorderLayout.NORTH); contentPane.add(scrollPane,BorderLayout.CENTER); contentPane.add(panel,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 FileChooserDemo1(); } public void actionPerformed(ActionEvent e) { File file = null; int result; /*当用户按下"打开文件"按钮时,JFileChooser的showOpenDialog()方法会输出文件对话框,并利用 *setApproveButtonText()方法取代按钮上"Open"文字;以setDialogTitle()方法设置打开文件对话框Title名称. *当使用选择完后,会将选择结果存到result变量中. */ if (e.getActionCommand().equals("新建文件")) { fileChooser.setApproveButtonText("确定"); fileChooser.setDialogTitle("打开文件"); result = fileChooser.showOpenDialog(f); textarea.setText(""); /*当用户按下打开文件对话框的"确定"钮后,我们就可以利用getSelectedFile()方法取得文件对象.若是用户按下打 *开文件对话框的"Cancel"钮,则将在label上显示"你没有选择任何文件"字样. */ if (result == JFileChooser.APPROVE_OPTION) { file = fileChooser.getSelectedFile(); label.setText("您选择打开的文件名称为:"+file.getName()); } else if(result == JFileChooser.CANCEL_OPTION) { label.setText("您没有选择任何文件"); } FileInputStream fileInStream = null; if(file != null) { try{ //利用FileInputStream将文件内容放入此数据流中以便读取. fileInStream = new FileInputStream(file); }catch(FileNotFoundException fe){ label.setText("File Not Found"); return; } int readbyte; try{ //以read()方法读取FileInputStream对象内容,当返回值为-1时代表读完此数据流.将所读到的字符显示 //在textarea中. while( (readbyte = fileInStream.read()) != -1) { textarea.append(String.valueOf((char)readbyte)); } }catch(IOException ioe){ label.setText("读取文件错误"); } finally{//回收FileInputStream对象,避免资源的浪费. try{ if(fileInStream != null) fileInStream.close(); }catch(IOException ioe2){} } } } //实作写入文件的功能. if (e.getActionCommand().equals("存储文件")) { result = fileChooser.showSaveDialog(f); file = null; String fileName; //当用户没有选择文件,而是自己键入文件名称时,系统会自动以此文件名建立新文件. if (result == JFileChooser.APPROVE_OPTION) { file = fileChooser.getSelectedFile(); label.setText("您选择存储的文件名称为:"+file.getName()); } else if(result == JFileChooser.CANCEL_OPTION) { label.setText("您没有选择任何文件"); } //写入文件我们使用FileOutputStream,在这个范例中,我们写入文件的方式是将之前内容清除并重新写入.若你想把 //新增的内容加在原有的文件内容后面,你可以使用FileOutputStream(String name,Boolean append)这个构造函数. FileOutputStream fileOutStream = null; if(file != null) { try{ fileOutStream = new FileOutputStream(file); }catch(FileNotFoundException fe){ label.setText("File Not Found"); return; } String content = textarea.getText(); try{ fileOutStream.write(content.getBytes()); }catch(IOException ioe){ label.setText("写入文件错误"); } finally{ try{ if(fileOutStream != null) fileOutStream.close(); }catch(IOException ioe2){} } } } } } 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; } } 13-2:建立颜色选择对话框(JColorChooer): JColorChooer的类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container --javax.swing.JComponent --javax.swing.JColorChooser Color Chooser可以让你选择所想要的颜色,并更改某个组件的颜色.例如在小画家中,你可以在画板上画上图案,并选择各式各样 的颜色来加以装饰;至于颜色的选择上,你可以在小画家中找到颜色选择对话框. JColorChooser构造函数: JColorChooser():建立一个JColorChooer对象,默认颜色为白色. JColorChooser(Color initialColor):建立一个JColorChooer对象,并设置初始颜色. JColorChooser(ColorSelectionModel modal):以ColorSelectionModel构造JColorChooser对象. 13-2-1:轻松输出颜色选择对话框: 最常使用JColorChooser的方式是使用JColorChooser的静态方法showDialog().也就是说在大部份的情况下,我们不会new一个 JColorChooser对象,而是直接使用JColorChooser的静态方法(showDialog())来输出颜色选择对话框.利用这个方法我们亦可以得到 用户所选择的颜色,若用户没有选择则返回null值. 另外还有一个使用JColorChooser常用的方式,那就是使用createDialog()静态方法.使用这个静态方法后会得到一个JDialog对 象,我们可以利用这个JDialog对象对颜色选择对话框做更多的设置.不过利用这个方法必须配合JColorChooser对象才行,也就是必须 new出一个JColorChooser对象来.下面范例我们先介绍第一种最简单的也是最实用的JColorChooser选择颜色完毕后就能更改JLabel 上的背景颜色. import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.util.*; import com.incors.plaf.alloy.*; import com.incors.plaf.alloy.themes.glass.*; public class ColorChooserDemo1 extends MouseAdapter { JFrame f = null; JLabel label = null; JLabel label1 = null; JLabel label2 = null; Rectangle rec1 = null; Rectangle rec2 = null; public ColorChooserDemo1() { f = new JFrame("ColorChooser Example"); Container contentPane = f.getContentPane(); contentPane.addMouseListener(this); label = new JLabel(" ",JLabel.CENTER); label.setPreferredSize(new Dimension(300,20)); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(1,2)); label1 = new JLabel("左Label",JLabel.CENTER); label1.setBackground(Color.red); label1.setForeground(Color.black); label1.setOpaque(true); label1.setBounds(0, 0, 150, 150); panel.add(label1); label2 = new JLabel("右Label",JLabel.CENTER); label2.setBackground(Color.green); label2.setForeground(Color.black); label2.setOpaque(true); label2.setBounds(150, 0, 150, 150); panel.add(label2); rec1 = label1.getBounds(); rec2 = label2.getBounds(); contentPane.add(panel,BorderLayout.CENTER); contentPane.add(label,BorderLayout.SOUTH); f.setSize(new Dimension(300,150)); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] arg) { SwingUtil.setLookAndFeel(); new ColorChooserDemo1(); } //实现MouseAdapter中的mousePressed()与mouseClicked()方法.当按下鼠标时,就能知道鼠标光标目前的位置.当连续键击鼠标 //两次时,若光标所在位置在label中,就会出现颜色选择对话框,用户可选择任一颜色更改label的颜色. public void mousePressed(MouseEvent e) { label.setText("目前鼠标坐标(X,Y)为:("+e.getX()+","+e.getY()+")"); } public void mouseClicked(MouseEvent e) { Point point = e.getPoint(); if (e.getClickCount() ==2) { if(rec1.contains(point)) { /*利用JColorChooser的showDialog()静态方法输出颜色选择对话框,showDialog()中的3个参数依次是: *对话框的父组件,颜色选择对话框标题,与对话框默认颜色.当用户选择完颜色之后,按下"OK"按钮则返回 *Color对象,若按下"Cancel"按钮则返回null值. */ Color color = JColorChooser.showDialog( f,"Change label1 Color",Color.white); if (color != null) //若为null值表示用户按下Cancel按钮 label1.setBackground(color); } if(rec2.contains(point)) { Color color = JColorChooser.showDialog( f,"Change label2 Color",Color.yellow); if (color != null) //若为null值表示用户按下Cancel按钮 label2.setBackground(color); } } } } class SwingUtil{ public static final void setLookAndFeel() { try{ Font font = new Font("JFrame", Font.PLAIN, 12); Enumeration keys = UIManager.getLookAndFeelDefaults().keys(); while (keys.hasMoreElements()) { Object key = keys.nextElement(); if (UIManager.get(key) instanceof Font) { UIManager.put(key, font); } } AlloyLookAndFeel.setProperty("alloy.isLookAndFeelFrameDecoration", "true"); AlloyTheme theme = new GlassTheme(); LookAndFeel alloyLnF = new AlloyLookAndFeel(theme); UIManager.setLookAndFeel(alloyLnF); }catch(UnsupportedLookAndFeelException ex){ ex.printStackTrace(); } } } 13-2-2:建立JColorChooser对象输出颜色选择对话框: 接下来我们介绍刚刚所提到使用JColorChooser的第二种方式,也就是使用createDialog()静态方法来输出颜色选择对话框.使 用这种方式的好处是颜色选择对话框可以做出多样性的变化,例如你可以使用JDialog中的setMenuBar()方法在颜色选择对话框中加 入菜单栏,或是利用JDialog的getContentPane()方法取得JDialog的ContentPane,然后对此ContentPane来做处理.下面范例我们修改 上个范例程序,并利用createDialog()方式来输出JColorChooser: import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ColorChooserDemo2 extends MouseAdapter implements ActionListener { JFrame f = null; JLabel label = null; JLabel label1 = null; JLabel label2 = null; Rectangle rec1 = null; Rectangle rec2 = null; JDialog dialog = null; JColorChooser colorChooser = null; public ColorChooserDemo2() { f = new JFrame("ColorChooser Example"); Container contentPane = f.getContentPane(); contentPane.addMouseListener(this); label = new JLabel(" ",JLabel.CENTER); label.setPreferredSize(new Dimension(300,20)); JPanel panel = new JPanel(); panel.setLayout(new GridLayout(1,2)); label1 = new JLabel("左Label",JLabel.CENTER); label1.setBackground(Color.red); label1.setForeground(Color.black); label1.setOpaque(true); label1.setBounds(0, 0, 150, 150); panel.add(label1); label2 = new JLabel("右Label",JLabel.CENTER); label2.setBackground(Color.green); label2.setForeground(Color.black); label2.setOpaque(true); label2.setBounds(150, 0, 150, 150); panel.add(label2); rec1 = label1.getBounds(); rec2 = label2.getBounds(); contentPane.add(panel,BorderLayout.CENTER); contentPane.add(label,BorderLayout.SOUTH); //建立一个新的JColorChooser对象,默认颜色为白色. colorChooser = new JColorChooser(); /*利用JColorChooser的createDialog()静态方法取得JDialog对象,createDialog()方法的最后两个参数是用来处理颜色 *选择对话框的"OK"与"Cancel"键的ActionEvent事件.读者可发现,这边并没有对颜色选择对话框的"Reset"做处理,因为 *内部系统会自动处理此事件,如此可减轻程序设计师的负担. */ dialog = colorChooser.createDialog(f, //parent component "Change Color", //title true, //modal colorChooser, //JColorChooser this,//okListenr this);//cancelListener f.setSize(new Dimension(300,150)); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] arg) { new ColorChooserDemo2(); } public void mousePressed(MouseEvent e) { label.setText("目前鼠标坐标(X,Y)为:("+e.getX()+","+e.getY()+")"); } boolean flag = true; public void mouseClicked(MouseEvent e) { Point point = e.getPoint(); //判断Double Click鼠标时的所在位置,若在label1或label2上则设置对话框的Title,并用show()方法将此对话框显示出来. if (e.getClickCount() ==2) { if(rec1.contains(point)) { flag = true; dialog.setTitle("Change label1 Color"); dialog.show(); } if(rec2.contains(point)) { flag = false; dialog.setTitle("Change label2 Color"); dialog.show(); } } } /*处理用户对颜色选择对话框中的按钮事件.当用户按下"OK"键时,便将label的背景颜色改变成用户所选择的颜色.当用户 *按下"Cancel"键时,则会用Dialog类所提供的dispose()方法就可以关闭颜色选择对话框了. */ public void actionPerformed(ActionEvent ae) { if(ae.getActionCommand().equals("OK")) { if (flag == true) label1.setBackground(colorChooser.getColor()); else label2.setBackground(colorChooser.getColor()); } if(ae.getActionCommand().equals("Cancel")) dialog.dispose(); } } 13-2-3:将JColorChooser置于一般容器中显示. 我们刚刚所讲的JColorChooser都是以对话框的形式出现.事实上JColorChooser可以置于一般的java容器上,不过这时候你就必 须实际构造出JColorChooser对象,并使用ColorSelectionModel来管理用户所选择的颜色.ColorSelectionModel本身是个interface .里面定义一些用户选择颜色或设置颜色的方法,并有addChangeListener()方法来检测用户是否改变了颜色的选择.要使用到 ColorSelectionModel Interface所定义的方法,理论上我们必须实现它,然而java本身可利用JColorChooser所提供的 getSelectionModel()方法得到ColorSelectionModel的实体.这时候就可以直接以ColorSelectionModel的addChangeListener()方法 来检测用户是否对颜色的选择有所改变,而不需要再另外实现这些方法. 每当用户JColorChooser上做一次颜色的改变时,就会触发ChangeEvent事件,因此我们必须实现ChangeListener界面来处理这个 事件.此界面只定义了一个方法,那就是stateChanged().下面范例我们将JColorChooser放在JPanel上,并在label上输出用户所选择 的颜色与颜色参数. import java.awt.*; import java.awt.event.*;//ChangeEvent是Swing的事件,因此我们必须将Swing的event package import进来. import javax.swing.*; import javax.swing.colorchooser.*; import javax.swing.event.*; public class ColorChooserDemo3 implements ChangeListener { JFrame f = null; JLabel label = null; JColorChooser colorChooser = null; public ColorChooserDemo3() { f = new JFrame("ColorChooser Example"); Container contentPane = f.getContentPane(); label = new JLabel(" ",JLabel.CENTER); //设定label背景颜色为不透明,这样才可以将label的背景颜色显示出来 label.setOpaque(true); //设定label上字体的颜色,也就是label的前景颜色 label.setForeground(Color.black); JPanel panel = new JPanel(); /*建立一个JColorChooser对象,并以getSelectionModel()方法取得ColorSelectionModel实体,并在这个实体上以 *addChangeListener()方法检测用户是否有改变颜色. */ colorChooser = new JColorChooser(); /****add code***/ //此处为下面"13-2-4中所要加代码的区块" /****add code***/ panel.add(colorChooser); ColorSelectionModel selectModel = colorChooser.getSelectionModel(); selectModel.addChangeListener(this); contentPane.add(label,BorderLayout.NORTH); contentPane.add(panel,BorderLayout.CENTER); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] arg) { new ColorChooserDemo3(); } //实现ChangeListener Interface,stateChanged()方法是在处理ChangeEvent事件.当用户改变颜色的选择时,我们就在label //输出用户所选择的颜色,并显示颜色参数. public void stateChanged(ChangeEvent e) { Color color = colorChooser.getColor(); label.setBackground(color); label.setText("您选择的颜色参数为:R:"+color.getRed()+ " G:"+color.getGreen()+" B:"+color.getBlue()); } } 13-2-4:改变JColorChooser的颜色选择面版. 在以前我们曾经提到JColorChooser提供3种面版让我们选择,分别"Swatches","HSB"与"RGB".这3个面版是java已经构造好的颜 色面版,如果佻要自行产生自己所设计的颜色面版,你可以继承AbstractColorChooserPanel这个抽象类,并实现里面的抽象方法,这个 抽象类位于javax.swing.colorchooser这个package中.当你实现完成之后,你可以使用JColorChooser类提供的addChooserPanel() 方法,或是setChooserPanels()方法,将你所设计的颜色面版增加到上图的颜色显示面版中. 若你想删除某一个颜色面版模式,你可以先使用JColorChooser类所提供的getChooserPanels()方法,得到类型为 AbstractColorChooserPanel的Array Object.例如在上例中运行所示,"Swatches"就会放在此类型的Array[0]中,面"HSB"会放在 Array[1]中,以此类推.得到此Array Object之后,我们就可以利用JColorChooser类提供的removeChooserPanel()方法.决定删除一个 颜色面版.例如我们若要删除上例运行所示的"HSB"面版,我们可以在上面范例/****add code***/里面增加这2行程序: AbstractColorChooserPanel[] colorPanel=colorChooser.getChooserPanels(); colorChooser.removeChooserPanel(colorPanel[1]); 13-3:建立分隔线(JSeparator): JSeparator)的类层次结构图: java.lang.Object --java.awt.Component --java.awt.Container --javax.swing.JComponent --javax.swing.JSeparator JSeparator通常用在菜单(Menu)或工具栏(ToolBar)上,可以明显地分格出不同的功能区域.在JMenu或JPopupMenu中我们可以使用 addSeparator()方法轻易的加入分隔线,但若是在一般的面版中呢?这时候我们必须自行建立JSeparator对象,然后再依照自己所需将 分隔线放在所想要的位置上.JSeparator有水平与垂直两种,建立的方式非常简单,我们来看看JSeparator的构造函数: JSeparator构造函数: JSeparator():建立水平的JSeparator组件. JSeparator(int orientation):建立水平或垂直的JSeparator组件. JSeparator类所提供的方法跟其他Swing组件比较起来算是少了许多,因为分隔线本身并没有什么功能可言,主要是设置分隔线的方 向,其他如分隔线的长短或设置位置方法,都可以在它的父类JComponent中找到.下面我们来看如何使用JSeparator,并显示水平与垂 直分隔线的外观. import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SeparatorDemo1 { JFrame f = null; public SeparatorDemo1() { f = new JFrame("Separator Example"); Container contentPane = f.getContentPane(); contentPane.setLayout(new BorderLayout(1,2)); JPanel panel1 = new JPanel(new GridLayout(2,1)); JLabel label = new JLabel("水平分隔线",JLabel.CENTER); JSeparator seph = new JSeparator(); panel1.add(label); panel1.add(seph); JTextArea textarea = new JTextArea(); textarea.setPreferredSize(new Dimension(150,100)); JPanel panel2 = new JPanel(new BorderLayout()); panel2.add(panel1,BorderLayout.NORTH); panel2.add(textarea,BorderLayout.CENTER); JPanel panel3 = new JPanel(new GridLayout(1,3)); label = new JLabel("垂直"); label.setVerticalAlignment(JLabel.CENTER); panel3.add(label); JSeparator sepv = new JSeparator(); sepv.setOrientation(JSeparator.VERTICAL); panel3.add(sepv); contentPane.add(panel2,BorderLayout.CENTER); contentPane.add(panel3,BorderLayout.EAST); f.pack(); f.setVisible(true); f.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public static void main(String[] arg) { new SeparatorDemo1(); } } Made by e-Stack Room http://www.mycnknow.com 来自:http://www.itbbs.cn/ShowPost.Asp?ID=1107
