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

 

效果图

 

 

posted on 2021-05-09 16:05  zhangmingda  阅读(810)  评论(0编辑  收藏  举报

导航