屏幕上任意位置的光标下的RGB值

时间:2016-11-12 16:10:43

标签: java swing jframe

我的代码将运行并编译。它可以在JFrame内部的任何地方悬停,但是当你进入屏幕时,它只会在某些情况下工作,如果有,它只会将RGB值视为白色,有时是灰色。我不确定为什么每次我跳出框外它都不起作用,为什么它不能在框架之外获得所有RGB值,而是在内部工作。有人可以看看吗?我附上了一个屏幕截图,悬停时在盒子外面给出了白色。谢谢!

enter image description here

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);
            } 
        });

    }

}

}

1 个答案:

答案 0 :(得分:1)

当通过Swing组件生成事件时,Swing仅接收鼠标事件。

如果您想在屏幕上的任何位置接收活动,那么您的相框需要覆盖整个屏幕。

您可以使用以下方法最大化框架:

frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
在使框架可见之前

当然现在框架将覆盖背景,因此您无法看到桌面,因此您需要使框架透明化。有关更多信息和示例,请参阅How to Create Translucent Frames上的Swing教程中的部分。