我正在尝试构建一个程序,该程序检测鼠标光标下的颜色,然后在屏幕上的窗口中显示颜色和RGB值。我对Java非常陌生,所以什么都不知道。在朋友的帮助下,我已经编写了两个代码,第一个代码获取缓冲图像的特定坐标的RGB值,另一个代码获取用户定义的RGB值并显示其中带有颜色的窗格。我的问题是“无论滚动到什么位置,如何获取程序来检测鼠标光标下的颜色?
public class Buffered_Image { public static void main(String[] args) throws IOException { BufferedImage bi = ImageIO.read(new File("C:/Users/user/Pictures/Hornet.jpg")); Color c = new Color(bi.getRGB(50,40)); int red=c.getRed(); int green=c.getGreen(); int blue=c.getBlue(); System.out.print("Red " + red + " Green " + green+ " Blue" + blue + "\n" ); } } public class RGB_Pane { public static void main(String[] args) { JFrame F = new JFrame("RGB"); Panel Pan = new Panel(); F.getContentPane().add(Pan); F.pack(); F.setVisible(true); F.setSize(300, 300); } } class Panel extends JPanel { public Panel() { setPreferredSize(new Dimension(200,200)); int Red = Integer.parseInt(JOptionPane.showInputDialog("Enter value for RED")); int Green = Integer.parseInt(JOptionPane.showInputDialog("Enter value for Green")); int Blue = Integer.parseInt(JOptionPane.showInputDialog("Enter value for BLUE")); Color Defined_Color = new Color(Red,Green,Blue); setBackground(Defined_Color); } }
正如@Hovercraft指出的那样。
首先看Robot#getPixelColor。
Robot#getPixelColor
您将需要知道鼠标光标在哪里,虽然没有“简单”的方式来跟踪光标,但是您可以使用以下方法获取它的当前位置 MouseInfo#getPointerInfo
MouseInfo#getPointerInfo
用示例更新
这只是这个概念的小例子。这基于鼠标光标的运动。一个可能的增强功能是当光标下的颜色也发生变化时也通知监视器侦听器。
public class WhatsMyColor { public static void main(String[] args) throws IOException { new WhatsMyColor(); } public WhatsMyColor() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException ex) { } catch (InstantiationException ex) { } catch (IllegalAccessException ex) { } catch (UnsupportedLookAndFeelException ex) { } try { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new MouseColorPane()); frame.setSize(400, 200); frame.setLocationRelativeTo(null); frame.setVisible(true); } catch (Exception exp) { exp.printStackTrace(); } } }); } public class MouseColorPane extends JPanel implements MouseMonitorListener { private Robot robot; private JLabel label; public MouseColorPane() throws AWTException { label = new JLabel(); setLayout(new GridBagLayout()); add(label); robot = new Robot(); PointerInfo pi = MouseInfo.getPointerInfo(); updateColor(pi.getLocation()); MouseMonitor monitor = new MouseMonitor(); monitor.setMouseMonitorListener(this); monitor.start(); } protected void updateColor(Point p) { Color pixelColor = robot.getPixelColor(p.x, p.y); setBackground(pixelColor); label.setText(p.x + "x" + p.y + " = " + pixelColor); } @Override public void mousePositionChanged(final Point p) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { updateColor(p); } }); } } public interface MouseMonitorListener { public void mousePositionChanged(Point p); } public static class MouseMonitor extends Thread { private Point lastPoint; private MouseMonitorListener listener; public MouseMonitor() { setDaemon(true); setPriority(MIN_PRIORITY); } public void setMouseMonitorListener(MouseMonitorListener listener) { this.listener = listener; } public MouseMonitorListener getMouseMonitorListener() { return listener; } protected Point getMouseCursorPoint() { PointerInfo pi = MouseInfo.getPointerInfo(); return pi.getLocation(); } @Override public void run() { lastPoint = getMouseCursorPoint(); while (true) { try { sleep(250); } catch (InterruptedException ex) { } Point currentPoint = getMouseCursorPoint(); if (!currentPoint.equals(lastPoint)) { lastPoint = currentPoint; MouseMonitorListener listener = getMouseMonitorListener(); if (listener != null) { listener.mousePositionChanged((Point) lastPoint.clone()); } } } } } }