我正在尝试构建一个程序来检测鼠标光标下的颜色,然后在屏幕上的窗口中显示颜色和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);
}
}
答案 0 :(得分:9)
正如@Hovercraft指出的那样。
首先查看Robot#getPixelColor
。
您需要知道鼠标光标的位置,而没有“简单”的方式来跟踪光标,您可以使用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());
}
}
}
}
}
}