屏幕上任意位置的光标下的RGB值
问题描述:
我的代码将运行并编译。如果您将鼠标悬停在JFrame内部的任何位置,它都可以工作,但是当您进入屏幕时,它只会有时会起作用,如果这样做,它只会将RGB值视为白色,有时也会显示为灰色。我不确定为什么每次我跳出盒子时都不起作用,为什么它不能在框架外获得所有的RGB值,但是可以在里面工作。有人可以看看吗?悬停后,我附上了一个截图,让它在盒子外面呈现白色。谢谢!当在Swing组件生成事件屏幕上任意位置的光标下的RGB值
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.net.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class RGBValue {
public static void main(String[] args) throws Exception {
new RGBValue();
}
public RGBValue() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Get the RGB");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
try {
frame.add(new TestPane());
} catch (Exception ex) {
Logger.getLogger(RGBValue.class.getName()).log(Level.SEVERE, null, ex);
}
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private BufferedImage img;
private JLabel label;
private JPanel fields;
private JTextField red;
private JTextField green;
private JTextField blue;
// private JTextArea RGB;
PointerInfo info = MouseInfo.getPointerInfo();
Point point = info.getLocation();
Robot robot = new Robot();
public TestPane() throws Exception {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
label = new JLabel();
try {
URL url = new URL("https://c6.staticflickr.com/2/1520/24330829813_944c817720_b.jpg");
img = ImageIO.read(url);
label.setIcon(new ImageIcon(img));
} catch (IOException ex) {
ex.printStackTrace();
}
add(label, gbc);
fields = new JPanel();
fields.setBorder(new EmptyBorder(5, 5, 5, 5));
red = new JTextField(3);
green = new JTextField(3);
blue = new JTextField(3);
fields.add(red);
fields.add(green);
fields.add(blue);
add(fields, gbc);
robot.delay(2000);
label.addMouseMotionListener(new MouseAdapter() {
// @Override
public void mouseMoved(MouseEvent e) {
// while (true) {
//int packedInt = img.getRGB(e.getX(), e.getY());
// Color color = new Color(packedInt, true);
point = MouseInfo.getPointerInfo().getLocation();
Color color = robot.getPixelColor((int)point.getX(), (int)point.getY());
// RGB.setText(color.getBlue() + color.getRed() + color.getGreen());
red.setText(Integer.toString(color.getRed()));
green.setText(Integer.toString(color.getGreen()));
blue.setText(Integer.toString(color.getBlue()));
fields.setBackground(color);
}
});
}
}
}
答
摇摆只接收鼠标事件。
如果你想在屏幕上的任何地方接收事件,那么你的框架需要覆盖整个屏幕。使框架可见之前
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
:
您可以通过使用最大化框架。
当然现在框架会覆盖背景,所以你不会看到桌面,所以你需要使框架透明。有关更多信息和示例,请参见How to Create Translucent Frames上的Swing教程部分。
虽然这是一个好主意,并且它确实在整个屏幕上进行了扩展,但它仍然只是有时需要RGB值。 – Millie
@Millie,'robot.delay(2000);' - 为什么你会有延迟?生成MouseEvent时将检索像素。所以更新频率由鼠标移动控制。 – camickr
考虑到这一点也不能解决它。我仍然不确定我要出错的地方。 – Millie