• java 图形化工具Swing 颜色文件选择器 ;JColorChooser;JFileChoose


    使用JColorChooser:

    JColorChooser用于创建颜色选择器对话框,该类的用法非常简单,该类主要提供了如下两个静态方法:
    • (1),showDialog(Component component, String title, Color initialColor): 显示一个模式的颜色选择器对话框,该方法返回用户所选颜色。其中component指定该对话框的parent组件,而title指定该对话框的标题,大部分时候都使用该方法来让用户选择颜色。
    • (2),createDialog(Component c, String title, boolean modal, JColorChooser chooserPane, ActionListener,okListener, ActionListener cancelListener): 该方法返回一个对话框,该对话框内包含指定的颜色选择器,该方法可以指定该对话框是模式的还是非模式的(通过 modal 参数指定) 还可以指定该对话框内"确定"按钮的事件监 器(通过 okListener 参数指定)和"取消"按钮的事件监听器 (通过 cancelLi tener 参数指定)。
    下面修改我们的手绘程序,用JColorChooser来实现:
    fontColor = JColorChooser.showDialog(jframe,"请选择颜色",Color.red,true);
    注意:swing 的JFrame 添加组件逻辑有点傻逼:JFrame.pack() 只会根据最后一次添加的组件大小设置窗口大小。本例手绘程序如果添加右键菜单项:jframe.add(jpopupMenu);是最后添加的组件,则窗口要比画板尺寸小。
     
    package swingtest;
    
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.image.BufferedImage;
    
    /**
     * @ClassName DrawCanvasTest
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/5/8.
     */
    public class DrawCanvasSwingTest {
        /**
         * 窗口
         */
        private JFrame jframe = new JFrame("JFrame手绘程序");
        /**
         * 定义画板
         */
        private final int canvasWidth = 600;
        private final int canvasHeight = 400;
        private Canvas canvas = new DrawCanvas();
        /**
         * 定义图片
         */
        private BufferedImage image = new BufferedImage(canvasWidth,canvasHeight,BufferedImage.TYPE_INT_BGR);
        /**
         * 获取图片对应的画笔,画笔的初始位置,初始颜色
         */
        private Graphics2D imageGraphics = (Graphics2D) image.getGraphics();
        private int drawX = -1;
        private int drawY = -1;
        private Color fontColor = new Color(255);
        /**
         * 画笔右键菜单
         */
        JPopupMenu jpopupMenu = new JPopupMenu();
        JMenuItem colorChoseItem = new JMenuItem("选择颜色");
    
        /**
         * 定义画板子类,定义画图图片
         */
        private class DrawCanvas extends Canvas {
            @Override
            public void paint(Graphics g) {
                g.drawImage(image,0, 0, null);
            }
        }
    
        private void start(){
            /**
             * 画板大小设置
             */
            canvas.setSize(canvasWidth,    canvasHeight);
            /**
             * 设置画笔粗细
             */
            imageGraphics.setStroke(new BasicStroke(5f));
            /**
             * 画笔右键菜单组合。添加到窗口,设置颜色选择器
             */
            jpopupMenu.add(colorChoseItem);
    
            colorChoseItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent actionEvent) {
                    fontColor = JColorChooser.showDialog(jframe,"请选择颜色",Color.red,true);
                }
            });
            /**
             * 画板中图片背景画成白色
             */
            imageGraphics.fillRect(0, 0, canvasWidth, canvasHeight);
            /**
             * 按下鼠标拖动时画图
             */
            canvas.addMouseMotionListener(new MouseAdapter() {
                //按下鼠标拖动
                @Override
                public void mouseDragged(MouseEvent e) {
                    /**
                     * 如果位置不在初始位置,开始画图
                     */
                    if (drawX != -1 && drawY != -1){
                        imageGraphics.setColor(fontColor);
                        imageGraphics.drawLine(drawX, drawY, e.getX(), e.getY());
                        canvas.repaint();
                    }//移动画笔位置到当前鼠标位置
                    drawX = e.getX();
                    drawY = e.getY();
                }
            });
    
            /**
             * 松开鼠标画笔归位-1;-1;
             */
            canvas.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseReleased(MouseEvent e) {
                    drawX = -1;
                    drawY = -1;
                    //如果是右键松开弹出选择颜色的弹框
                    if (e.isPopupTrigger()){
                        jpopupMenu.show(canvas,e.getX(), e.getY());
                    }
                }
            });
    
            /**
             * 窗口关闭
             */
            jframe.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            /**
             * 窗口添加组件,设置位置大小,注意这里要把jframe要添加的组件中尺寸最大的最后添加,.pack() 才能调接到最大尺寸
             */
            jframe.add(jpopupMenu);
            jframe.add(canvas);
            jframe.setLocation(400,300);
            jframe.pack();
            jframe.setVisible(true);
        }
        public static void main(String[] args) {
            new DrawCanvasSwingTest().start();
        }
    }

    JFileChooser:

    JFileChooser的功能与AWT中的FileDialog基本相似,也是用于生成"打开文件"、"保存文件"对话框。与FileDialog不同的是JFileChooser无须依赖于本地平台的GUI,它由100%Java实现,在所有平台 具有完全相同的行为,并可以在所有平台上具有相同的外观风格。

    JFileChooseer的使用步骤如下:

    • 采用构造器创建一个JFileChooser对象,该JFileChooser对象无须指定parent组件,这表示可以在多个窗口中共用该JFileChooser对象。创建JFileChooser对象时可以指定初始化路径:JFileChooser chooser = new JFileChooser(".");
    • 调用JFileChooser系列可选的方法对JFileChooser 执行初始化操作。
    • setSelectedFile/setSelectedFiles: 指定该文件选择器默认选择的文件(也可以默认选择多个文件)。
    //默认选择当前路径下的123.jpg文件
    chooser.setSelectedFile(new File( "123.jpg" ));
    setMultiSelectionEnabled(boolean b): 在默认情况下,该文件选择器只能选择一个文件,通过调用该方法可以设置允许选择多个文件(设置参数值为 true 即可)。
    • setFileSelectionMode(int mode): 在默认情况下,该文件选择器只能选择文件,通过调用该方法可以设置允许选择文件、路径、 文件与路径,设置参数值为JFileChooser.FILES_ONLY
      JFileChooser.DlRECTORIES_ONLY
      JFileChooser.FILES_AND_DIRECTORIES
    • 用JFileChooser系列可选的方法对JFileChooser执行过滤器初始化操作:
    1. addChoosableFileFilter(FileFilter filter): 添加文件过滤器 通过该方法允许该文件对话框有多个文件过滤器。
    2. setFileFilter(FileFilter filter): 设置文件过滤器 。一旦调用了该方法,将导致该文件对话框只有过滤器
    • 调用showXxxDialog方法可以打开文件对话框
    测试代码:
     文件选择器的定义和配置
    JFileChooser jFileChooser = new JFileChooser(".");//文件选择器构造
    jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("选择图片(*.jpg,*.png,*.gif,*.goubi)","jpg", "gif", "png","goubi")); //配置文件过滤器
    jFileChooser.setAcceptAllFileFilterUsed(true); //设置接受所有文件过滤器

    文件选择器的使用:
    事件监听器触发文件选择器show展示在对应组件中,返回选择的结果进行判断和处理。

    int result = jFileChooser.showOpenDialog(jFrame); 定义变量查看文件选择器选择后的结果
    result == JFileChooser.APPROVE_OPTION 文件选择成功
    jFileChooser.getSelectedFile().getPath();从文件选择器获取文件路径。做对应处理
    知识点+:图片在JFrame组件JLabel组件中展示
    JLabel label = new JLabel();
    jFrame.add(label);
    label.setIcon(new ImageIcon(openFilePath))

    完整测试代码

    package swingtest;
    
    import javax.swing.*;
    import javax.swing.filechooser.FileNameExtensionFilter;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    /**
     * @ClassName ImageShowSwing
     * @projectName: object1
     * @author: Zhangmingda
     * @description: XXX
     * date: 2021/5/9.
     */
    public class ImageShowSwing {
        public static void main(String[] args) {
            JFrame jFrame = new JFrame("图片查看器");
            JMenuBar menuBar = new JMenuBar();
            JMenu fileMenu = new JMenu("文件");
            JMenuItem openMenuItem = new JMenuItem("打开");
            fileMenu.add(openMenuItem);
            menuBar.add(fileMenu);
            jFrame.setJMenuBar(menuBar);
    
            JLabel label = new JLabel();
            jFrame.add(label);
    
            /**
             * 文件过滤器设置:打开的默认文件路径.为当前路径
             */
            JFileChooser jFileChooser = new JFileChooser(".");
            /**
             * 自定义文件过滤器,可以设置任何规则,比如以什么文件名开头,或者文件名结尾。
             */
    //        jFileChooser.addChoosableFileFilter(new FileFilter() {
    //            @Override
    //            public boolean accept(File f) {
    //                if (f.isDirectory()) {
    //                    return true;
    //                }
    //                String name = f.getName().toLowerCase();
    //                List<String> extensions = Arrays.asList(".jpg", ".gif", ".png");
    //                for (String extension : extensions) {
    //                    if (name.endsWith(extension)) {
    //                        return true;
    //                    }
    //                }
    //                return false;
    //            }
    //            @Override
    //            public String getDescription() {
    //                return "选择图片(*.jpg,*.png,*.gif)";
    //            }
    //        });
            /**
             * 使用已有文件名(后缀)过滤器 FileNameExtensionFilter(String description, String... extensions)
             */
            jFileChooser.addChoosableFileFilter(new FileNameExtensionFilter("选择图片(*.jpg,*.png,*.gif,*.goubi)","jpg", "gif", "png","goubi"));
            //让不能被文件过滤器过滤的文件,不展示在我们的这个选择对话框内
            jFileChooser.setAcceptAllFileFilterUsed(true);
            openMenuItem.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    System.out.println("点击了打开文件");
                    int result = jFileChooser.showOpenDialog(jFrame);
                    if (result == JFileChooser.APPROVE_OPTION) {//如果图片文件被打开了
                        String openFilePath = jFileChooser.getSelectedFile().getPath();
                        label.setIcon(new ImageIcon(openFilePath));
                    }
                }
            });
            jFrame.setBounds(100, 100, 600, 600);
            jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            jFrame.setVisible(true);
        }
    }
    效果图
  • 相关阅读:
    字符串方法
    函数的属性和方法
    数组的去重!!
    常见的数组方法
    JS中的函数
    JavaScript 中表达式和语句的区别
    运算符优先级
    题解 CF813B 【The Golden Age】
    题解 CF834B 【The Festive Evening】
    题解 CF810B 【Summer sell-off】
  • 原文地址:https://www.cnblogs.com/zhangmingda/p/14748067.html
Copyright © 2020-2023  润新知