Java-实现简单取色器

Java实现简单取色器

  • 2019.12.10更:功能基本完善
  • github:https://github.com/yx1120/TakeColor

  1. 功能描述:

在这里插入图片描述

  1. 存在的问题:(已解决)

在这里插入图片描述

  1. 代码:
package com.version2;

/**主界面类
 * @author xu
 * @create 2019-07-12 7:54
 */
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.*;

/**
 * @author xu
 * @create 2019-07-11 10:47
 */
public class Frame01 {

    private JFrame frame;
    private JPanel bigPanel;
    private JPanel smaPanel;

    //时刻改变的值
    private JLabel labelRgb;
    private JLabel labelHex;

    //清空和复制按钮
    private JButton clear;
    private JButton copy;

    //列表框
    private JScrollPane listScroll;
    private JList<String> list;
    private DefaultListModel<String> dlm;
    private String[] elements = new String[6];

    //鼠标第一次按下相对frame的位置
    private int firstX;
    private int firstY;

    //鼠标拖动窗体后相对(0,0)的位置,
    private int ZeroX;
    private int ZeroY;

    //是否能改变JLabel内容标记
    private boolean isOK = true;
    //获取颜色线程
    private ColorGet colorGet;

    Frame01(){
        frame = new JFrame();
        bigPanel = new JPanel();
        smaPanel = new JPanel();

        clear = new JButton("清空");
        copy = new JButton("复制");

        labelRgb = new JLabel("rgb");
        labelHex = new JLabel("hex");

        list = new JList<String>();
        listScroll = new JScrollPane(list);
        dlm = new DefaultListModel<String>();

        init();
        colorGet = new ColorGet();
        colorGet.start();
    }

    public void init(){
        frame.setLayout(null);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setBounds(200, 200, 300, 200);
        frame.setUndecorated(true);

        bigPanel.setLayout(null);
        bigPanel.setBounds(0,0,300,200);

        smaPanel.setBounds(10,10,100,100);
        smaPanel.setBackground(new Color(255,0,0));

        labelRgb.setBounds(10,120,100,30);
        labelHex.setBounds(10,160,100,30);
        labelHex.setFont(new Font("微软雅黑",Font.BOLD,14));
        labelRgb.setFont(new Font("微软雅黑",Font.BOLD,14));

        labelRgb.setBackground(new Color(255,255,0));
        labelHex.setBackground(new Color(255,0,255));

        clear.setBounds(135,160,65,30);
        copy.setBounds(210,160,65,30);
        clear.setBackground(new Color(240,240,240));
        copy.setBackground(new Color(240,240,240));
        clear.setFont(new Font("微软雅黑",Font.BOLD,13));
        copy.setFont(new Font("微软雅黑",Font.BOLD,13));
        copy.setBackground(Color.pink);

        listScroll.setBounds(135,10,140,150);
        //设置列表宽高
        list.setFixedCellHeight(30);
        list.setFixedCellWidth(135);
        //设置选择模式
        list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        list.setFont(new Font("微软雅黑",Font.BOLD,15));

        bigPanel.add(smaPanel);
        bigPanel.add(labelRgb);
        bigPanel.add(labelHex);
        bigPanel.add(listScroll);
        bigPanel.add(clear);
        bigPanel.add(copy);

        frame.add(bigPanel);

        frameEvent();
        listEvent();
        frame.setVisible(true);
    }

    /**
     * 事件处理
     */
    private void frameEvent(){
        //全局键盘监听事件alt
        Toolkit tk = Toolkit.getDefaultToolkit();
        tk.addAWTEventListener(new AllAwtEventListener(), AWTEvent.KEY_EVENT_MASK);

        //窗体frame
        frame.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent e) {
                super.mouseEntered(e);
                isOK = false;
            }

            @Override
            public void mouseExited(MouseEvent e) {
                super.mouseExited(e);
                isOK = true;
            }

            @Override
            public void mousePressed(MouseEvent e) {
                if (e.getClickCount() == 1) {
                    firstX = e.getX();
                    firstY = e.getY();
                }
            }
        });

        //拖动frame
        frame.addMouseMotionListener(new MouseMotionAdapter() {
            @Override
            public void mouseDragged(MouseEvent e) {
                super.mouseDragged(e);
                Point p = frame.getLocation();
                //获取此时鼠标的位置,然后通过鼠标的位置-相对位置=frame此时的位置
                ZeroX = p.x + e.getX();
                ZeroY = p.y + e.getY();
                frame.setLocation(ZeroX-firstX,ZeroY-firstY);
            }
        });

        //清空按钮
        clear.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                /*for(int i = 0; i<elements.length; i++){
                    elements[i]="";
                }
                list.setListData(elements);*/
                dlm.clear();
                list.setModel(dlm);
            }
        });
    }

    private void listEvent(){
        // 添加选项选中状态被改变的监听器
        //有问题:按下(未松开手)时,从“未选中--选中”。。(释放时)又从“选中--未选中”
        //单击一下,执行了3次,也就有3次状态改变
        //暂未解决,只有双击才能解决(目前可用的解决方法,)
        list.addListSelectionListener(new ListSelectionListener() {
            @Override
            public void valueChanged(ListSelectionEvent e) {

                //获取选中项索引
                int index = e.getFirstIndex();
                //获取hex值
                String strHex = dlm.getElementAt(index);
                System.out.println(strHex);
                //复制到系统剪切板
                SystemTextTool.setClipboardString(strHex);
                //去掉#
                String colorHex = strHex.substring(1);
                //从字符串16进制恢复到整型16进制数
                int hexInt = Integer.parseUnsignedInt(colorHex,16);
                smaPanel.setBackground(new Color(hexInt));

                labelRgb.setText(ColorToHex.toInt(colorHex));
                labelHex.setText("#"+colorHex);
                //设置选中条颜色
                list.setSelectionBackground(new Color(hexInt));
                //勿漏,刷新ListModel
                list.setModel(dlm);
                copy.setBackground(Color.green);
            }
        });

        list.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseExited(MouseEvent e) {
                copy.setBackground(Color.pink);
            }
            @Override
            public void mouseEntered(MouseEvent e){
                isOK = false;
            }
            @Override
            public void mouseClicked(MouseEvent e){
                if(e.getClickCount()==1){
                    System.out.println("单击一次:"+list.getSelectedValue());
                }

            }
        });
    }
    public static void main(String[] args) {
        new Frame01();
        //new Fang();
    }

    //全局监听类
    class AllAwtEventListener implements AWTEventListener {
        @Override
        public void eventDispatched(AWTEvent event){
            //先判断事件类型--键盘按下事件
            if(event.getID() == KeyEvent.KEY_PRESSED){
                KeyEvent keyEvent = (KeyEvent)event;
                //如果按下的是Alt+C
                if(keyEvent.isAltDown() && keyEvent.getKeyCode()==KeyEvent.VK_C){

                    System.out.println("你按到'全局Alt+c'键了");
                    String hex = labelHex.getText().trim();
                    SystemTextTool.setClipboardString(hex);

                    //添加到list内,并改变list背景色为所获取颜色
                    //放到第一行,所有元素后移,插入头部---错误方法

                    //添加,删除元素,都使用DefaultListModel--ListModel的子类来
                    dlm.add(0,hex);
                    //把第一行颜色换成获取到的颜色
                    list.setModel(dlm);
                }
            }
        }
    }

    //获取颜色的线程
    class ColorGet extends Thread{
        private Point mousePoint;
        private Robot robot;
        private Color color;
        private String rgb;
        private String hex;

        @Override
        public void run(){
            while (true){

                // 使用中断机制,来终止线程
                if (Thread.currentThread().isInterrupted()) {
                    System.out.println("Interrupted ...");
                    break;
                }
                try{
                    robot = new Robot();
                }catch (AWTException e){
                    e.printStackTrace();
                }
                mousePoint = MouseInfo.getPointerInfo().getLocation();
                /*由于打包成.exe文件后,屏幕与原来的屏幕小了1.5倍,所以在这里先乘1.5倍。然后鼠标位置就是
                当前真正的位置
                forWindows
                *
                color = robot.getPixelColor((int)(mousePoint.getX()*1.5),(int)(mousePoint.getY()*1.5));
*/
                color = robot.getPixelColor((int)(mousePoint.getX()*1),(int)(mousePoint.getY()*1));

                hex = ColorToHex.toHex(color.getRed(),color.getGreen(),color.getBlue());
                rgb = color.getRed()+","+color.getGreen()+","+
                        color.getBlue();

                //isOK代表暂停窗体内容标记
                if(isOK){
                    //给面板设置为鼠标位置的颜色
                    smaPanel.setBackground(color);
                    //改变标签颜色
                    labelHex.setText(hex);
                    labelRgb.setText(rgb);
                }
            }
        }
    }
}

系统剪切板类

参考:https://blog.csdn.net/xietansheng/article/details/70478266

package com.version2;

/**
 * @author xu
 * @create 2019-07-12 7:56
 */

import java.awt.*;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;

/**系统剪切板,复制
 * @author xu
 * @create 2019-07-10 17:01
 */
public class SystemTextTool {
    /**
     * 把文本设置到剪贴板(复制)
     */
    public static void setClipboardString(String text) {
        // 获取系统剪贴板
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
        // 封装文本内容
        Transferable trans = new StringSelection(text);
        // 把文本内容设置到系统剪贴板
        clipboard.setContents(trans, null);
    }

    /**
     * 从剪贴板中获取文本(粘贴)
     */
    public static String getClipboardString() {
        // 获取系统剪贴板
        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();

        // 获取剪贴板中的内容
        Transferable trans = clipboard.getContents(null);

        if (trans != null) {
            // 判断剪贴板中的内容是否支持文本
            if (trans.isDataFlavorSupported(DataFlavor.stringFlavor)) {
                try {
                    // 获取剪贴板中的文本内容
                    String text = (String) trans.getTransferData(DataFlavor.stringFlavor);
                    return text;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        return null;
    }

    public static void main(String[] args) {
        setClipboardString("hello");
        System.out.println(getClipboardString());
    }
}


颜色转换类

package com.version2;

/**
 * @author xu
 * @create 2019-07-12 7:55
 */
/**
 * 将rgb值装换为16进制值,
 * 将16进制转为rgb
 */
public class ColorToHex {

    public static String toHex(int r, int g, int b) {
        return "#" + toBrowserHexValue(r) + toBrowserHexValue(g)
                + toBrowserHexValue(b);
    }

    private static String toBrowserHexValue(int rgb) {
        StringBuilder sb = new StringBuilder(
                Integer.toHexString(rgb & 0xff));
        //为什么要和0xff做&运算?保持二进制补码的一致性
        while (sb.length() < 2) {
            sb.append("0");
        }
        return sb.toString().toUpperCase();
    }

    public static String toInt(String hex){
        //要头不要尾
        String r = rgbToNumber(hex.substring(0,2));
        String g = rgbToNumber(hex.substring(2,4));
        String b = rgbToNumber(hex.substring(4,6));

        return "["+r+","+g+","+b+"]";
    }
    private static String rgbToNumber(String str){
        return ""+Integer.parseUnsignedInt(str,16);
    }

    public static void main(String[] args) {
        System.out.println(toHex(255, 0, 0));
        System.out.println(Integer.parseUnsignedInt("a8",16));
    }
}



  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值