`

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();
    }
}

分享到:
评论

相关推荐

    JFileChoose读取文件保存上次浏览路径

    JFileChoose打开的保存上次浏览的路径,你还在等什么

    JFileChoose的使用

    JFileChoose的使用详解,JFileChooser 用来提供一个文件对话框,可以通过其 showXxxDialog 打开一 个模态对话框,或直接实例化并加入到其他组件。

    Swing图片查看器

    Swing做的简单图片查看器,JFileChoose的用法。

    JAVA Swing容器

    6. 可编辑信息的显示:JColorChooser, JFileChoose, JFileChooser, JTable, JTextArea JComponent 的特殊功能 1. 边框设置:使用 setBorder() 方法可以设置组件外围的边框,使用一个 EmptyBorder 对象能在组件周围...

    单项海洋环境影响评价等级表.docx

    单项海洋环境影响评价等级表.docx

    基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】

    【作品名称】:基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:本设计中的波形发生器系统要求基于51单片机,因此选用以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器的硬件系统。使用C 语言对单片机编程可产生相应的正弦波,方波,三角波,锯齿波梯形波波形信号。在程序运行时,当接收到按键信息后,需要输出某种波形时,调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出即可得到要求的波形。 当需要改变频率时只需要改变单片机的波形发生程序中的递增或者递减变量即可。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 完全多元图的最大匹配问题研究 共9页.pdf

    数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 完全多元图的最大匹配问题研究 共9页.pdf

    毕设源码-基于Python Web的社区爱心养老管理系统设计与实现_hvhwz--论文-期末大作业+说明文档.rar

    本项目是基于Python Web的社区爱心养老管理系统,旨在为社区养老提供一个全面、高效的管理平台。系统集成了用户管理、老人信息管理、健康管理、活动管理、服务管理等多项功能,通过简洁明了的界面,让管理人员能够轻松地进行各项操作,从而更好地服务于社区老人。 在架构上,系统采用B/S模式,前端使用HTML、CSS、JavaScript等技术,搭配Vue.js框架,实现了用户友好的交互界面;后端则基于Python的Django框架,提供了稳定且高效的服务端逻辑处理能力。数据库选用MySQL,确保了数据的存储安全和高效访问。 开发此项目的目的,不仅是为了满足计算机相关专业学生的毕设需求,提供一个实战练习的平台,更是希望通过实际项目的开发,培养学生的专业技能和实践能力,同时,也希望能为社区养老服务贡献一份力量,通过科技手段,让老年人的生活更加美好、便捷。

    教学版单体spring-petlinic,课程《Kubernetes微服务实践》.zip

    教学版单体spring-petlinic,课程《Kubernetes微服务实践》

    密码学领域的Vigenère多表密码算法解析与实现

    内容概要:本文介绍了16世纪法国外交家Blaise de Vigenère提出的一种多表密码算法,详细解释了Vigenère密码的加密解密机制及其历史应用背景。特别提到了当明文M的长度超过密钥K的情况下,密钥会被重复使用的技巧。 适合人群:对古典密码学感兴趣的初学者,以及希望深入理解密码编码基本原理的学习者。 使用场景及目标:了解Vigenère密码的工作原理,掌握简单的加解密技术,增强信息安全意识。能够自行实施加解密操作,理解经典密码学的基本概念和技术。 其他说明:本文不仅提供了理论讲解,还给出了具体的例子帮助理解和实操练习。

    STM32-EMBPI.PDF

    STM32-EMBPI : Embedded Pi, triple-play platform for STM32, Raspberry Pi and Arduino

    电子电气架构-汽车网络管理策略分析(整车至单件层面)

    内容概要:本文主要探讨了电子电气架构中的网络管理策略,尤其是针对汽车中多个ECU(Electronic Control Unit)的协同管理和低功耗设计。通过引入网络管理状态机的概念,详细介绍了各状态(如常规运行状态、重复报文状态、准备睡眠模式、预睡眠模式、深度睡眠模式等)的具体运作机制及其在汽车电子系统中的重要性。文中还讨论了网络管理报文的设计与传输规则,特别是控制位向量CBV的定义,强调了网络管理在节能降耗方面的关键作用。 适用人群:具备一定汽车电子工程背景的专业人士或研究者,尤其对网络管理及低功耗设计感兴趣的工程师。 使用场景及目标:适用于汽车设计与制造企业的研发部门,帮助其优化电子控制系统,提升产品能效比,降低维护成本,提高用户体验。通过对网络管理策略的理解与应用,达到降低车载电子系统功耗的目的,进而延长电动车的续航能力和降低传统燃油车的油耗。 其他说明:文章不仅提供了理论上的阐述,还包括了具体的操作指南和技术细节,有助于从业者深入理解和实施网络管理方案。同时提醒在现代信息化社会中保持屏蔽力的重要性,鼓励读者专注于自己的发展目标,避免无效的精力分散。

    英飞凌TC3XX-MCAL培训PPT

    英飞凌TC3XX_MCAL培训PPT

    缴费综合服务系-JAVA-基于springBoot高校网上缴费综合服务系统设计与实现

    缴费综合服务系-JAVA-基于springBoot高校网上缴费综合服务系统设计与实现

    Python与机器学习方向,《TensorFlow基础教程》课程仓库.zip

    Python与机器学习方向,《TensorFlow基础教程》课程仓库

    本科毕业设计 基于Python+Django教学资源管理系统网站详细文档+全部资料.zip

    【资源说明】 本科毕业设计 基于Python+Django教学资源管理系统网站详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    电动汽车与软件定义汽车(SDV)时代的汽车行业数字化转型

    内容概要:文章详细讨论了汽车行业正经历的重大变革,尤其是电动汽车(EV)和软件定义汽车(SDV)对行业的深远影响。随着技术的进步,汽车的差异化优势不再仅限于机械硬件,而是越来越多地取决于软件和服务。这一转型要求汽车制造商重新评估现有的解决方案堆栈,加大在电气化和连接性等领域的投资,以实现车型的电气化并支持可扩展性和全生命周期更新。同时,汽车的开发重点已经从机电领域转向了芯片和软件领域,强调基于云计算的协作开发方法。 适合人群:汽车行业专业人士、汽车电子工程师、技术研发人员及政策制定者。 使用场景及目标:帮助读者理解和把握汽车行业数字化转型的趋势,指导他们在电动汽车和软件定义汽车领域做出正确的技术投资和战略调整。 其他说明:本文不仅讨论了技术变革,还深入剖析了由此带来的商业和运营模式的变化,为汽车行业的未来发展方向提供了洞见。

    微信课堂助手 微信小程序+PHP毕业设计 源码+数据库+论文+启动教程.zip

    微信课堂助手 微信小程序+PHP毕业设计 源码+数据库+论文+启动教程

    新设博士后科研工作站备案申请表.xlsx

    新设博士后科研工作站备案申请表.xlsx

    的玩具 Python 实现.zip

    的玩具 Python 实现手套蟒蛇GloVe的玩具 Python 实现。Glove 产生单词的密集向量嵌入,其中一起出现的单词在生成的向量空间中靠得很近。虽然这会产生与word2vec (在gensim中有一个很棒的 python 实现)类似的嵌入,但方法不同GloVe 通过对语料库词共现矩阵的对数进行分解来产生嵌入。代码采用异步随机梯度下降,用Cython实现,很可能存在大量bug。安装使用 pip 从 pypi 安装pip install glove_python。OSX 用户请注意由于使用 OpenMP,glove-python 无法在 Clang 下编译。要安装它,您需要一个较新的版本gcc(例如来自 Homebrew)。应该由 接收setup.py如果没有,请打开一个问题。使用 OSX 中包含的默认 Python 发行版进行构建也不受支持请尝试 Homebrew 或 Anaconda 中的版本。用法生成嵌入分为两个步骤从语料库中创建共现矩阵,然后使用它生成嵌入。该类Corpus有助于从可交互的标记构建语料库该类Glove训练嵌入(使

Global site tag (gtag.js) - Google Analytics