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(){//全局键盘监听事件altToolkit tk = Toolkit.getDefaultToolkit();tk.addAWTEventListener(new AllAwtEventListener(), AWTEvent.KEY_EVENT_MASK);//窗体frameframe.addMouseListener(new MouseAdapter() {@Overridepublic void mouseEntered(MouseEvent e) {super.mouseEntered(e);isOK = false;}@Overridepublic void mouseExited(MouseEvent e) {super.mouseExited(e);isOK = true;}@Overridepublic void mousePressed(MouseEvent e) {if (e.getClickCount() == 1) {firstX = e.getX();firstY = e.getY();}}});//拖动frameframe.addMouseMotionListener(new MouseMotionAdapter() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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));//勿漏,刷新ListModellist.setModel(dlm);copy.setBackground(Color.green);}});list.addMouseListener(new MouseAdapter() {@Overridepublic void mouseExited(MouseEvent e) {copy.setBackground(Color.pink);}@Overridepublic void mouseEntered(MouseEvent e){isOK = false;}@Overridepublic 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 {@Overridepublic void eventDispatched(AWTEvent event){//先判断事件类型--键盘按下事件if(event.getID() == KeyEvent.KEY_PRESSED){KeyEvent keyEvent = (KeyEvent)event;//如果按下的是Alt+Cif(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;@Overridepublic 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));}
}

Java-实现简单取色器相关推荐

  1. Java实现简单在线播放器——支持优酷和土豆

    今天本来是打算继续写"Java新浪微博客户端开发"的,也实现了"系统托盘","点击查看大图"的功能,写到一半,想起上篇博文中有CSDN有一网 ...

  2. 安卓打开java文件管理器_Android开发之简单文件管理器实现方法

    本文实例讲述了Android开发之简单文件管理器实现方法.分享给大家供大家参考,具体如下: 这里运用Java I/O.ListActivity.Dialog.Bitmap等实现简单文件管理器,可以查看 ...

  3. 10款屏幕取色器/颜色拾取工具软件介绍及下载地址[转]

    10款屏幕取色器/颜色拾取工具软件介绍及下载地址(附截图) 2009年12月07日 14:13 在做网页设计和程序界面的时候,看到比较喜欢的图片颜色,总是要拾取下来应用到自己的网页或图片的颜色中,但是 ...

  4. java简单通讯录的实现02person类_用java实现简单的小游戏(你一定玩过)

    用java实现简单的小游戏(你一定玩过) 对于java初学者来说,通过一些学习小游戏来对swing学习以及对java基础的学习是一个好的方法,同时也给学习带来了很多的乐趣,接下来就给大家分享一个jav ...

  5. 使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用...

    在线演示  本地下载 如果你曾经开发过内容聚合类网站的话,使用程序动态整合来自不同页面或者网站内容的功能肯定对于你来说非常熟悉.通常使用java的话,我们都会使用到一些HTML的解析,例如,httpp ...

  6. JVM(3):Java GC算法 垃圾收集器

    概述 垃圾收集 Garbage Collection 通常被称为"GC",它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数 ...

  7. 文件管理器android实现,Android开发之简单文件管理器实现方法

    易采站长站为您分析Android开发之简单文件管理器实现方法,简单实现了Android的文件目录查看,文件重命名,打开,删除等功能,需要的朋友可以参考下 本文实例讲述了Android开发之简单文件管理 ...

  8. android 取色器_老板夸我PPT配色高级,以为我学过设计,其实我都是从Logo取色

    我们都知道用好一个 logo,可以做出一套比较简洁而且精致的 PPT 模板. 为了让这个页面看起来更丰富一些,我们选取的颜色是 logo 的主色调: 虽然一直在强调我们要从 logo 中取色,但是在进 ...

  9. 26 Java GC算法 垃圾收集器、标记 -清除算法、复制算法、标记-压缩算法、分代收集算法

    26.Java GC算法 垃圾收集器 1.1.1标记 -清除算法 1.1.2复制算法 1.1.3标记-压缩算法 1.1.4分代收集算法 26.Java GC算法 垃圾收集器 概述 垃圾收集 Garba ...

  10. android 自定义取色器,【Android自定义View】仿Photoshop取色器ColorPicker(二)

    ColorPicker 一款仿Photoshop取色器的Android版取色器. 前言 上一篇已经简单介绍了ColorPicker的项目结构以及两种颜色空间,接下来我们详细解析一下ColorPicke ...

最新文章

  1. 了解黑客的关键工具---揭开Shellcode的神秘面纱
  2. Android maps应用
  3. 韩文版ie8 启用java_只有在启用了javascript的情况下,IE8才会在IE8模式下重新加载崩溃...
  4. java 加载中_Java 6类加载中更快的是什么?
  5. java final 修改_“无法改变的设计”——浅谈Java中的final关键字
  6. coreData mapView #include
  7. Docker教程介绍
  8. linux基础配置脚本,Linux中selinux基础配置教程详解
  9. 科学与技术名词解释计算机病毒,名词解释计算机病毒
  10. leetcode 61 Rotate List ----- java
  11. 453. Minimum Moves to Equal Array Elements 一次改2个数,变成统一的
  12. play另一个模板japid
  13. Java设计模式(十二)----享元模式
  14. linux服务器测试接口命令,Linux 下 TCP/UDP 端口测试及验证方法说明
  15. RecycleView获取所有的ViewHolder
  16. 使用java做出围棋或者五子棋
  17. processing交互应用——双人对战游戏
  18. 基于任务点的加速仿真
  19. C#,深入浅出全接触
  20. moment.js获取当天,本周,当月,当季,近n天开始结束时间

热门文章

  1. QQ截图取色器:没有吸管工具的情况下,跨软件随时随地快捷取色
  2. java什么是自动类型转换_java自动类型转换
  3. cadnaa噪声分析测试软件,德国Cadna/A环境噪声模拟软件系统介绍
  4. 信息安全工程师考试大纲(含pdf)
  5. 前端小白系列——打字游戏
  6. 软考中级 软件设计师资料(考点分析+复习笔记+历年真题+电子版课本)
  7. vue+springboot实现登录验证码(前后端分离)
  8. 2018年全国大学生电子设计竞赛TI杯赛题简单回顾和准备经验分享
  9. 锐起无盘系统菜鸟教程
  10. sql server express 2005下载地址