Java版取色器(6)——实现具体功能
发布日期:2021-05-04 08:03:10 浏览次数:24 分类:原创文章

本文共 15278 字,大约阅读时间需要 50 分钟。

本章概要:实现该项目的具体功能

1、上节回顾:

由于需要对界面的组件进行一些操作,所以应该定义一些变量在方法之外,以便整个类能够进行调用,其实并没有什么改变。

其中Main.java的内容如下:

package com.mycom.myapp.colorpicker;import javax.swing.*;import javax.swing.border.TitledBorder;import java.awt.*;import static java.awt.Color.BLACK;import static java.awt.Color.RED;/** * @author lck100 */public class Main {    private JFrame mainFrame;    private JSplitPane splitPane;    private JPanel showColorPane, showValuePane, settingPane, descriptionPane, changePane, rgbToHexPane, rgbTextFieldPane, transformButtonPane, transformButtonPane2, hexToRgbPane, hexTextFieldPane;    private JButton startColorPickerButton, rgbToHexButton, hexToRgbButton;    private JTextArea textArea, hexTextArea, rgbTextArea;    private JLabel RLabel, GLabel, BLabel, HEXLabel, descriptionLabel;    private JTextField RTextField, GTextField, BTextField, HEXTextField, rTextField, gTextField, bTextField, hexResultTextField, inputHexTextField, rResultTextField, gResultTextField, bResultTextField;    private JCheckBox checkBox;    private Box vbox;    /**     * 得到一个主窗体对象     *     * @return 返回得到的JFrame     */    public JFrame mainFrame() {        // 实例化一个主窗体对象        mainFrame = new JFrame();        // 设置窗体的标题        mainFrame.setTitle("取色器");        // 设置窗体的尺寸大小        mainFrame.setSize(900, 450);        // 设置窗体的不允许用户自由调整大小        mainFrame.setResizable(false);        // 设置窗体的图标(注意图标路径问题)        mainFrame.setIconImage(Toolkit.getDefaultToolkit().createImage("src/main/resources/images/colorpicker.png"));        // 创建拆分面板作为主面板        splitPane = new JSplitPane();        // 设置分隔条上折叠/展开按钮的显示        splitPane.setOneTouchExpandable(true);        // 设置当拖动分隔条时连续重绘组件        splitPane.setContinuousLayout(true);        // 设置分隔条的位置        splitPane.setDividerLocation(mainFrame.getWidth() / 2);        // 设置拆分面板的左侧组件为取色器面板        splitPane.setLeftComponent(getColorPickerPane());        // 设置拆分面板的右侧组件为转换面板        splitPane.setRightComponent(getChangePane());        // 将拆分面板设为主窗体的内容面板        mainFrame.setContentPane(splitPane);        // 设置窗体的关闭方式        mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        // 返回主窗体        return mainFrame;    }    /**     * 设置取色器的面板内容     *     * @return 返回设置好的取色器面板     */    private Box getColorPickerPane() {        vbox = Box.createVerticalBox();        // 实例化一个显示取色的面板        showColorPane = new JPanel();        // 设置该面板的布局方式        showColorPane.setLayout(new BorderLayout());        // 创建一个启动取色功能的按钮        startColorPickerButton = new JButton("取色");        // 创建一个文本域来显示取到的颜色        textArea = new JTextArea(10, 25);        // 设置文本域不可编辑        textArea.setEditable(false);        // 设置文本域默认背景颜色        textArea.setBackground(Color.BLACK);        // 设置文本域无边界        textArea.setBorder(null);        // 将按钮添加到面板中并设置显示在北部位置        showColorPane.add(startColorPickerButton, BorderLayout.NORTH);        // 将文本域添加到面板中并设置显示到中部位置        showColorPane.add(textArea, BorderLayout.CENTER);        // 将面板添加到vbox中        vbox.add(showColorPane);        // 实例化一个显示RGB值和HEX值的面板        showValuePane = new JPanel();        // 设置面板的布局方式为流动布局        showValuePane.setLayout(new FlowLayout());        // 创建R标签        RLabel = new JLabel("红(R):");        // 创建R文本框        RTextField = new JTextField(2);        // 创建G标签        GLabel = new JLabel("绿(G):");        // 创建G文本框        GTextField = new JTextField(2);        // 创建B标签        BLabel = new JLabel("蓝(B):");        // 创建B文本框        BTextField = new JTextField(2);        // 创建HEX标签        HEXLabel = new JLabel("HEX:");        // 创建HEX文本框        HEXTextField = new JTextField(6);        // 将上面这些组件添加到面板中        showValuePane.add(RLabel);        showValuePane.add(RTextField);        showValuePane.add(GLabel);        showValuePane.add(GTextField);        showValuePane.add(BLabel);        showValuePane.add(BTextField);        showValuePane.add(HEXLabel);        showValuePane.add(HEXTextField);        // 将面板添加到vbox中        vbox.add(showValuePane);        // 创建一个设置面板        settingPane = new JPanel();        // 设置面板的边界        settingPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY, 2, true), "设置", TitledBorder.LEFT, TitledBorder.TOP, new Font("微软雅黑", Font.PLAIN, 16), BLACK));        // 创建一个复选框,默认被勾选        checkBox = new JCheckBox("总是在最上层", false);        // 设置复选框的字体        checkBox.setFont(new Font("微软雅黑", Font.PLAIN, 16));        // 将复选框添加到面板中        settingPane.add(checkBox);        // 将该面板添加到vbox中        vbox.add(settingPane);        // 创建一个说明面板        descriptionPane = new JPanel();        // 设置面板的边界        descriptionPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY, 2, true), "说明", TitledBorder.LEFT, TitledBorder.TOP, new Font("微软雅黑", Font.PLAIN, 16), BLACK));        // 创建一个说明标签        descriptionLabel = new JLabel();        // 设置标签内容        descriptionLabel.setText("按下Alt键取色,可以直接在剪贴板复制RGB颜色");        // 设置标签字体        descriptionLabel.setFont(new Font("微软雅黑", Font.PLAIN, 16));        // 将标签添加到面板中        descriptionPane.add(descriptionLabel);        // 将该面板添加到vbox中        vbox.add(descriptionPane);        // 返回设置好的vbox        return vbox;    }    /**     * 设置转换面板的面板内容     *     * @return 返回设置好的转换面板     */    private JPanel getChangePane() {        // 创建一个转换面板        changePane = new JPanel();        // 设置面板的布局方式为网格布局        changePane.setLayout(new GridLayout(2, 1));        // 创建一个rgb转hex的面板        rgbToHexPane = new JPanel();        // 设置面板布局方式为边界布局        rgbToHexPane.setLayout(new BorderLayout());        // 设置面板的边界        rgbToHexPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY, 2, true), "RGB颜色代码转化成16位颜色", TitledBorder.LEFT, TitledBorder.TOP, new Font("微软雅黑", Font.BOLD, 16), RED));        // 创建一个放置输入RGB值文本框的面板        rgbTextFieldPane = new JPanel();        // 创建R文本框        rTextField = new JTextField(2);        // 创建G文本框        gTextField = new JTextField(2);        // 创建B文本框        bTextField = new JTextField(2);        // 将R,G,B文本框添加到面板中        rgbTextFieldPane.add(rTextField);        rgbTextFieldPane.add(gTextField);        rgbTextFieldPane.add(bTextField);        // 将该面板添加到rgbToHexPane中        rgbToHexPane.add(rgbTextFieldPane, BorderLayout.NORTH);        // 创建一个文本域来显示颜色        hexTextArea = new JTextArea(6, 6);        // 设置文本域不可编辑        hexTextArea.setEditable(false);        // 将文本域添加到rgbToHexPane中        rgbToHexPane.add(hexTextArea, BorderLayout.CENTER);        // 创建一个转换结果面板        transformButtonPane = new JPanel();        // 创建一个转换按钮        rgbToHexButton = new JButton("转换");        // 创建一个显示HEX值的文本框        hexResultTextField = new JTextField(5);        // 添加rgbToHexButton和hexResultTextField到transformButtonPane中        transformButtonPane.add(rgbToHexButton);        transformButtonPane.add(hexResultTextField);        // 将transformButtonPane添加到rgbToHexPane中        rgbToHexPane.add(transformButtonPane, BorderLayout.SOUTH);        // 将rgbToHexPane添加到转换面板        changePane.add(rgbToHexPane);        // 创建一个hex转成rgb的面板        hexToRgbPane = new JPanel();        // 设置面板的布局方式为边界边界        hexToRgbPane.setLayout(new BorderLayout());        // 设置面板的边界        hexToRgbPane.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY, 2, true), "十六位颜色代码转化成RGB颜色", TitledBorder.LEFT, TitledBorder.TOP, new Font("微软雅黑", Font.BOLD, 16), RED));        // 创建一个输入hex的文本框面板        hexTextFieldPane = new JPanel();        // 创建一个输入hex的文本框        inputHexTextField = new JTextField(6);        // 将文本框添加到文本框面板中        hexTextFieldPane.add(inputHexTextField);        // 将hexTextFieldPane添加到hexToRgbPane中        hexToRgbPane.add(hexTextFieldPane, BorderLayout.NORTH);        // 创建一个显示颜色的文本域        rgbTextArea = new JTextArea();        // 设置文本域不可编辑        rgbTextArea.setEditable(false);        // 将rgbTextArea添加到hexToRgbPane中        hexToRgbPane.add(rgbTextArea, BorderLayout.CENTER);        // 创建转换按钮面板transformButtonPane2        transformButtonPane2 = new JPanel();        // 创建转换按钮        hexToRgbButton = new JButton("转换");        // 创建R结果显示文本框        rResultTextField = new JTextField(2);        // 创建G结果显示文本框        gResultTextField = new JTextField(2);        // 创建B结果显示文本框        bResultTextField = new JTextField(2);        // 将这些文本框和按钮添加到transformButtonPane2中        transformButtonPane2.add(hexToRgbButton);        transformButtonPane2.add(rResultTextField);        transformButtonPane2.add(gResultTextField);        transformButtonPane2.add(bResultTextField);        // 将transformButtonPane2添加到hexToRgbPane中        hexToRgbPane.add(transformButtonPane2, BorderLayout.SOUTH);        // 将hexToRgbPane添加到转换面板        changePane.add(hexToRgbPane);        // 返回设置好的转换面板        return changePane;    }}

如上述代码所示,添加了许多变量。

那么测试类Test.java中也需要改变,不能再通过类直接调用静态方法进行调用了。

其Test.java内容如下:

package com.mycom.myapp.colorpicker;/** * @author lck100 */public class Test {    public static void main(String[] args) {        new Main().mainFrame().setVisible(true);    }}

点击运行,结果如上一节所展示的一样:

这个项目需要实现的功能有如下几个:

  1. 从屏幕中取色并显示在界面中同时显示它的RGB值和HEX值;

  2. “总是在最上层”复选框的实现;

  3. 点击【转换】按钮将RGB颜色代码转化成16进制颜色;

  4. 点击【转换】按钮将16进制颜色转化成RGB颜色值。

 

2、实现取色

在这个项目中最主要的是取色的实现:

在Main.java中的getColorPickerPane方法中添加如下代码:

   /**         * 给startColorPickerButton按钮添加键盘事件监听器         */        startColorPickerButton.addKeyListener(new KeyListener() {            @Override            public void keyTyped(KeyEvent e) {                // 键入某个键            }            @Override            public void keyPressed(KeyEvent e) {                // 释放某个键            }            @Override            public void keyReleased(KeyEvent e) {                // 按下某个键                // 当按下Alt键时触发事件                if (e.getKeyCode() == 18) {                    try {                        // Robot 可以模拟鼠标和键盘的输入。基于给定屏幕设备创建一个Robot                        Robot robot = new Robot();                        // 获取鼠标在屏幕中移动的坐标位置                        Point mousePoint = MouseInfo.getPointerInfo().getLocation();                        // 获取鼠标所在位置的X值                        int X = mousePoint.x;                        // 获取鼠标所在位置的Y值                        int Y = mousePoint.y;                        // 获取指定屏幕坐标处的像素颜色                        Color pixelColor = robot.getPixelColor(X, Y);                        // 分别获取Color的R,G,B值                        int R = pixelColor.getRed();                        int G = pixelColor.getGreen();                        int B = pixelColor.getBlue();                        // 分别将获取到的R,G,B及HEX值显示在界面中                        RTextField.setText(String.valueOf(R));                        GTextField.setText(String.valueOf(G));                        BTextField.setText(String.valueOf(B));                        HEXTextField.setText("#" + Integer.toHexString(R) + Integer.toHexString(G) + Integer.toHexString(B));                        // 对取得的颜色进行显示                        textArea.setBackground(new Color(R, G, B));                        // 把RGB值复制到剪贴板中直接使用                        // 获取系统的剪贴板                        Clipboard systemClipboard = Toolkit.getDefaultToolkit().getSystemClipboard();                        // 对RGB值进行封装                        StringSelection stringSelection = new StringSelection(R + "," + G + "," + B);                        // 把文本内容设置到系统剪贴板                        systemClipboard.setContents(stringSelection, null);                    } catch (AWTException e1) {                        e1.printStackTrace();                    }                }            }        });

代码解释说明:

  • 通过对startColorPickerButton按钮添加键盘事件监听器来对当按下Alt键后的事件处理。

  • 可以通过e.getKeyChar()获取键盘按下的字符;通过e.getKeyCode()获取键盘按下键对应的数值。

  • Robot,机器人。Robot 的主要目的是便于 Java 平台实现自动测试,也可以模拟鼠标和键盘的输入。

  • MouseInfo.getPointerInfo().getLocation()可以得到鼠标在电脑屏幕中的当前坐标位置。

  • 通过Robot的getPixelColor(X,Y)方法来得到当前位置的像素颜色,就这样实现了取色。

  • 下面的代码就是将获取到的颜色显示在界面。

运行程序,效果图如下:

 

3、实现总是在最上层

接下来是实现复选框的【总是在最上层】的功能。

在getColorPickerPane()方法中添加如下代码:

        /**         * 复选框状态改变监听器         */        checkBox.addChangeListener(new ChangeListener() {            @Override            public void stateChanged(ChangeEvent e) {                // 判断复选框是否被选中                if(checkBox.isSelected()){                    // 设置主窗体置于最上层                    mainFrame.setAlwaysOnTop(true);                }else {                    // 取消主窗体置于最上层                    mainFrame.setAlwaysOnTop(false);                }            }        });
  • 代码解释说明:
  • 通过对checkBox添加状态改变监听器来实现如果复选框被勾选则使主窗体处于最上层,否则不。

  • 判断复选框checkBox是否被选中通过JCheckBox的isSelected()方法来得到,被选中返回true,否则返回false。

  • 使窗体处于最上层其实是使JFrame处于最上层,所以是设置JFrame的setAlwaysOnTop()方法实现的,其中参数是boolean类型,是true则使其处于最上层,否则不。

产生的效果图如下:

 

4、实现RGB转HEX

接下来就是实现RGB和HEX之间的转换。

在colorpicker包下新建一个Utils类,该类用来放置一些在整个项目中要用到的方法。

先讲将RGB转换成HEX的实现。

在Utils类中添加如下一个方法:

 /**     * 将三位RGB值转换成HEX格式     * @param R 十进制的R值     * @param G 十进制的G值     * @param B 十进制的B值     * @return 返回转换成功HEX格式的字符串     */    public String rgbToHex(int R,int G,int B){        return "#"+Integer.toHexString(R)+Integer.toHexString(G)+Integer.toHexString(B);    }

该方法就是将RGB转换成HEX的方法,在主界面中的【转换】按钮直接调用这个方法即可。

为getChangePane()方法添加如下代码:

        /**         * 为rgbToHexButton添加活动监听器         */        rgbToHexButton.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // 获取文本框的R,G,B值被转换成整型                int R = Integer.parseInt(rTextField.getText());                int G = Integer.parseInt(gTextField.getText());                int B = Integer.parseInt(bTextField.getText());                // 在hexTextArea显示要转换的颜色                hexTextArea.setBackground(new Color(R,G,B));                // 显示转换成功的HEX值                hexResultTextField.setText(new Utils().rgbToHex(R,G,B));            }        });
  • 代码解释说明:
  • RGB到HEX的转换是通过触发【转换】按钮的点击事件监听器来实现的,而具体的转换则是调用的Utils类中的rgbToHex()方法来完成的。

  • 值得注意的是,从文本框获取的是字符串类型的值,而不是我们所需要的整型,因此需要进行转换。

运行程序,测试结果如下:

 

5、实现HEX转RGB

说完了将RGB转换成HEX,接下来将如何将HEX转换成RGB。

同样地,在Utils.java中添加如下方法:

 /**     * 操作结果:将HEX格式字符串转换成Color对象     * @param hex HEX格式字符串     * @return Color 转换完成的颜色对象     */    public Color hexToRgb(String hex){        String rHex=hex.substring(1,3);        String gHex=hex.substring(3,5);        String bHex=hex.substring(5,7);        int R=Integer.parseInt(rHex,16);        int G=Integer.parseInt(gHex,16);        int B=Integer.parseInt(bHex,16);        return new Color(R,G,B);    }

在Main.java中的getChangePane()方法中添加如下代码:

     /**         * 为hexToRgbButton添加活动监听器         */        hexToRgbButton.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                // 获取输入的HEX值                String text = inputHexTextField.getText();                // 获取转换后的Color对象                Color color = new Utils().hexToRgb(text);                // 显示转换的颜色                rgbTextArea.setBackground(color);                // 显示转换的结果R,G,B                rResultTextField.setText(String.valueOf(color.getRed()));                gResultTextField.setText(String.valueOf(color.getGreen()));                bResultTextField.setText(String.valueOf(color.getBlue()));            }        });

代码解释说明:

  • HEX到RGB的转换是通过触发【转换】按钮的点击事件监听器来实现的,而具体的转换则是调用的Utils类中的hexToRgb()方法来完成的。

  • 其中文本框的setText()方法中的参数是字符串类型,而通过Color对象分别得到的R,G,B值都是整型,也都需要使用String.valueOf()方法进行转换。

运行程序,测试效果图如下:

下一节将会对界面进行一些简单的装饰。

 

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【20191001】可获取本节源码。

上一篇:Dreamweaver中将Git存储库与此站点关联报错“Dreamweaver未在您的计算机上找到Git客户端”
下一篇:Java版取色器(5)——实现主界面

发表评论

最新留言

表示我来过!
[***.240.166.169]2025年03月26日 01时09分38秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

阿里大牛手撕SpringBoot,Cloud,Nginx与Docker,你凭什么搞不懂 2019-03-04
结局已定,一点不慌,秋招京东三面,给了意料之中的20KOffer。 2019-03-04
Java开发5年的我偶然被几条朋友圈打击,成功点燃,别说了,不去阿里对不起自己! 2019-03-04
面试清单(Java岗):算法+Spring+中间件+设计模式+Java+JVM+数据库 2019-03-04
凭借这份pdf,安卓顺利转行Java,成功4面拿下美团offer 2019-03-04
团体程序设计天梯赛-练习集 L1-006 连续因子 (20分) 2019-03-04
编程技巧妙用 2019-03-04
团体程序设计天梯赛-练习集 L1-023 输出GPLT (20分) 2019-03-04
团体程序设计天梯赛-练习集 L2-007 家庭房产 (25分) 并查集思想+坑点分析 2019-03-04
暴打算法:王者级数据结构与LeetCode笔记,一路绿灯杀进字节Java岗 2019-03-04
团体程序设计天梯赛-练习集 L2-020 功夫传人 (25分) dfs深搜 2019-03-04
不愧是Alibaba技术官,随便甩出本kafka限量笔记,都火遍全网 2019-03-04
爱了!腾讯技术官手写SpringCloud笔记,GitHub已标星81.6k 2019-03-04
惊喜万分!全靠这份999页Java面试宝典,我刚拿到美团offer 2019-03-04
三个步骤,一天就搞定了MySQL,顺利入职京东天猫 2019-03-04
蘑菇街被裁,奋战7个月拿下字节跳动offer 2019-03-04
三面阿里Java岗被挂,竟获内推名额,历经5面拿下口碑offer 2019-03-04
整合:2021年已收录GitHub的最新、最全、最实用的Java岗面试真题 2019-03-04
限时开源!公布半小时下载量达10W:阿里大牛出品「MyCat笔记」 2019-03-04
阿里Java全线成长宝典,从P5到P8一应俱全 2019-03-04