Java: 如何从不可见的面板中获取检查颜色

Java: How got check colors from an invisible panel

是否可以读取不可见面板的鼠标位置的颜色? 我想要一个带有颜色编码图像的 "invisible overlay"。 我使用 Robot class 来获取我的鼠标位置和颜色。

public void mouseClicked(MouseEvent evt){
        Robot r = new Robot(); 
        Point p = evt.getLocationOnScreen();
        Color color = r.getPixelColor(p.x,p.y);
        System.out.println(color);                  
 }

它在我的可见图像上运行良好,但如果我将图像设置为不可见,它就会完全被忽略。 有没有办法获得相同的结果(获取我的鼠标位置的颜色),但对于不可见的 image/panel?

编辑:其他问题(希望允许)也对我有帮助: 是否可以获得单个 JLayeredPane 的颜色(我的鼠标位置)? 我使用几个带有小图像的 JLayeredPanes。它们都具有相同的大小,但部分透明,因此它们创建了一个大图像,我可以在其中更改其中的单个部分。 我的问题也将得到解决,如果我能够获得单个 JLayeredPane 的颜色(我的鼠标位置),分别可以检查它是否透明。

您可以创建任何组件的 BufferedImage。一旦你有了 BufferedImage,你就可以使用 getRGB(…) 方法来获取像素的颜色。

创建任何组件的 BufferedImage 的最简单方法是使用 Screen Image class。您可以创建框架的图像、框架上的任何组件或组件的任何矩形区域。

在下面的示例中,右侧的标签是不可见组件的图像。当您在左侧的空白标签周围移动鼠标时,背景将更改为指示不可见组件上像素的颜色:

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import javax.swing.*;
import javax.swing.event.*;

public class InvisibleImage extends JPanel
{
    public InvisibleImage()
    {
        setLayout( new GridLayout(0, 2) );

        JLabel invisible = new JLabel( new ImageIcon("mickeyred.jpg") );
        invisible.setVisible( false );

        BufferedImage image = ScreenImage.createImage( invisible );

        JLabel panel = new JLabel();
        panel.setOpaque( true );
        add(panel);

        JLabel label = new JLabel( new ImageIcon( image ) );
        add(label);

        panel.addMouseMotionListener( new MouseMotionAdapter()
        {
            @Override
            public void mouseMoved(MouseEvent e)
            {
                int pixelColor = image.getRGB(e.getX(), e.getY());
                Color color = new Color( pixelColor );
                panel.setText( color.toString() );
                panel.setBackground( color );
            }
        });
    }

    private static void createAndShowGUI()
    {
        JFrame frame = new JFrame("InvisibleImage");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new InvisibleImage() );
        frame.pack();
        frame.setLocationByPlatform( true );
        frame.setVisible( true );
    }

    public static void main(String[] args) throws Exception
    {
        java.awt.EventQueue.invokeLater( () -> createAndShowGUI() );
    }
}

如果您不想使用 ScreenImage class 那么您可以使用以下方法创建 BufferedImage:

invisible.setSize( invisible.getPreferredSize() );
Dimension d = invisible.getSize();
BufferedImage image = new BufferedImage(d.width, d.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = image.createGraphics();
invisible.print( g2d );
g2d.dispose();