第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

时间: 2024-08-04 17:55:46

第12章-Swing编程 --- 使用JFileChooser和Java7增强的JColorChooser的相关文章

第12章-Swing编程 --- Swing概述

(一)Swing概述 将Swing组件按功能来分: ->顶层容器: JFrame.JApplet.JDialog和JWindow ->中间容器: JPanel.JScrollPane.JSplitPane.JToolBar等 ->特殊容器:在用户界面上具有特殊作用的中间容器,如JInternalFrame.JRootPane.JLayeredPane和JDestopPane等 ->基本组件:实现人机交互的组件,如JButton.JComboBox.JList.JMenu.JSlid

第12章Swing编程

第12章Swing编程 Swing它采用100%java实现 不在依赖本地平台,所有平台都可以保持相同的运行效果,对跨平台支持比较出色  实现了MVC设计模式也称为Model-Delegate(模式-代理) 12.1 Swing概况 独立于本地平台的Swing(速度慢点)组件被称为轻量级组件,而依赖本地平台的AWT组件被称为重量级组件 12.2 Swing 基本组件的用法 12.2.1 Swing 组件层次 大部分Swing组件都是JComponent抽象类的直接或者间接子类,JComponen

第12章-Swing编程 --- Swing中的特殊容器--JSplitPane

(一)使用JSplitPane JSplitPane用于创建一个分割板,它可以将一个组件(通常是一个容器)分割成两个部分,并提供一个分割条.用户可以拖动该分隔条来调整两个部分的大小.分隔面板的实质是一个特殊容器,该容器只能容纳两个组件,而且分割面板又分为上下分割.左右分割两种情形. 创建分割面板的代码如下: new JSplitPane(方向,左/上组件,右/下组件); JSplitPane分割面板提供了如下几个方法: (1)setDividerLocation(double proportio

第12章-Swing编程 --- 使用JProgressBar、ProgressMonitor和BoundedRangeModel创建进度条

第12章-Swing编程 --- 使用JProgressBar.ProgressMonitor和BoundedRangeModel创建进度条 (一)创建进度条 使用JProgressBar,可以很方便的创建进度条,其步骤如下: (1)创建一个JProgressBar对象,创建该对象时也可以指定3个参数,用于设置进度条的排列方向(竖直和水平).进度条的最大值和最小值.也可以在创建该对象时不传入任何参数,而是在后面程序中修改这3个属性. 下面代码创建了JProgressBar对象 //创建一条垂直进

第12章-Swing编程 --- 使用JToolBar创建工具条

Swing提供了JToolBar类来创建工具条,创建JToolBar对象时可以指定如下两个参数: -->name: 该参数指定该工具条的名称. -->orientation:该参数指定该工具条的方法. JToolBar对象还有如下几个常用方法: -->JButton add(Action a): 通过Action对象为JToolBar添加对应的工具按钮. -->void addSeparator(Dimension size):向工具条中添加指定大小的分隔符. -->void

第12章-Swing编程 --- 使用JOptionPane

通过使用JOptionPane可以非常方便的创建一些简单的对话框. JOptionPane提供了如下3个方法来创建对话框: (1)showMessageDialog/showInternalMessageDialog:消息对话框,告知用户某事已发生,用户只能单击"确认"按钮. (2)showConfirmDialog/showInternalMessageDialog:确认对话框,向用户确认某个问题,用户可以选择 yes.no.cancel等选项. (3)showInputDialog

第12章 Swing编程

12.1 Swing概述 12.2 Swing基本组件的用法 12.2.1 java 7的Swing组件层次 12.2.2 AWT组件的Swing实现 12.2.3 为组件设置边框 12.2.4 Swing组件的双缓存和键盘驱动 12.2.5 使用JToolBar创建工具条 12.2.6 使用JFileChooser和java 7增强的JColorChooser 12.2.7 使用JOptionPane 12.3 Swing中的特殊容器 12.3.1 使用JSplitPane 12.3.2 使用

Python for Infomatics 第12章 网络编程一(译)

注:以下文章原文来自于Dr Charles Severance 的 <Python for Informatics> 本书中的许多例子关注的是从读取文件并查找数据,但在互联网中还有许多不同信息源. 本章我们将伪装成浏览器用超文本传送协议(HTTP)从网站获取网页,通读并分析它. 12.1 超文本传送协议-HTTP 支撑网页运转的网络协议实际非常简单,在Python中内置了套接字(socket)模块,使得使用套接字创建网络连接并获取数据变得非常容易. 套接字最很像文件,可以对它进行读写,但它还提

Python for Infomatics 第12章 网络编程三(译)

注:文章原文为Dr. Charles Severance 的 <Python for Informatics>.文中代码用3.4版改写,并在本机测试通过. 12.5 HTML分析和网页抓取 urllib库一项最常用的功能是抓取网页.就是我们编写一个程序,将自己伪装成网页浏览器,在获取网页之后,再以查找模式检索网页中的数据. 以搜索引擎Google为例,它将查看一个网页的源码,然后抽取其中的链接,再用这些链接获取网页.抽取链接,并一直循环.使用这个技巧,Google几乎爬遍网页上的所有页面. G