JDK-7029560 : On Linux java.awt.Robot cannot see through windows with transparent backgroung color
  • Type: Bug
  • Component: client-libs
  • Sub-Component: java.awt
  • Affected Version: 7
  • Priority: P2
  • Status: Closed
  • Resolution: Duplicate
  • OS: linux
  • CPU: x86
  • Submitted: 2011-03-21
  • Updated: 2013-02-20
  • Resolved: 2011-03-22
Related Reports
Duplicate :  
Relates :  
Description
Platform: Linux - FAILS
          Windows - PASSES
JDK: 7

Problem: 

    When a window has bg color with alpha component set to zero it is transparent visually, but java.awt.Robot on Linux considers it BLACK.

Please see the following code sample: 

Two windows are created red on the front, green in background. Color of the foreground one is being set to new Color(123, 123, 123, 0) - it disappears visually but the robot considers it black. BTW, it is interesting to play with opacity as having zero opacity and NON-transparent background will let robot experience transparency.

---------------------------------------------------------------------------------------------------
import javax.swing.*;
import java.awt.*;

public class BlindRobot {

    public static void main(String[] args) throws Exception {

        System.out.println("started");
        final Window[] window = new Window[1];
        final Window[] bgWindow = new Window[1];
        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                bgWindow[0] = new Window(null);
                bgWindow[0].setSize(100, 100);
                bgWindow[0].setLocationRelativeTo(null);
                bgWindow[0].setBackground(Color.GREEN);
                bgWindow[0].setVisible(true);
                bgWindow[0].toFront();

                window[0] = new Window(null);
                window[0].setSize(100, 100);
                // centering window on screen
                window[0].setLocationRelativeTo(null);
                window[0].setBackground(Color.RED);
                window[0].setVisible(true);
                window[0].setAlwaysOnTop(true);
                window[0].toFront();

            }
        });

        Thread.sleep(3000);

        SwingUtilities.invokeAndWait(new Runnable() {
            public void run() {
                GraphicsDevice device = window[0].getGraphicsConfiguration().getDevice();

                System.out.println("PERPIXEL_TRANSLUCENT = " + device
                        .isWindowTranslucencySupported(GraphicsDevice
                                .WindowTranslucency.PERPIXEL_TRANSLUCENT));
                System.out.println("TRANSLUCENT = " + device
                        .isWindowTranslucencySupported(GraphicsDevice
                                .WindowTranslucency.TRANSLUCENT));

                window[0].setOpacity(0f);

                final Color transparentColor = new Color(123, 123, 123, 0);
                // COMMENT THIS TO GET GREEN ON LINUX
                window[0].setBackground(transparentColor);

            }
        });

        Thread.sleep(3000);


        int zeroX = window[0].getX();
        int zeroY = window[0].getY();

        java.awt.Robot robot = new java.awt.Robot(window[0].getGraphicsConfiguration().getDevice());

        System.out.println("createScreenCapture = " + new Color(robot.createScreenCapture
                (new Rectangle(zeroX + 10, zeroY + 10, 1, 1)).getRGB(0, 0)));
        System.out.println("pixelColor          = " + robot.getPixelColor(zeroX
                + 10, zeroY + 10));

        Thread.sleep(3000);

        window[0].dispose();
        bgWindow[0].dispose();

    }

}
---------------------------------------------------------------------------------------------------


The result will be:

[stt-robot@stt-119]$ /set/java/re/jdk/7/promoted/latest/binaries/linux-i586/bin/java -cp . BlindRobot
started
PERPIXEL_TRANSLUCENT = true
TRANSLUCENT = true
createScreenCapture = java.awt.Color[r=0,g=0,b=0]
pixelColor          = java.awt.Color[r=0,g=0,b=0]