< prev index next >
test/javax/swing/JComponent/6683775/bug6683775.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2009, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
--- 1,7 ----
/*
! * Copyright (c) 2009, 2017, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*** 22,54 ****
*/
/*
* @test
* @key headful
! * @bug 6683775 6794764
! * @summary Painting artifacts is seen when panel is made setOpaque(false) for a translucent window
! * @author Alexander Potochkin
! * @modules java.desktop/com.sun.awt
! * java.desktop/sun.awt
! * @run main bug6683775
*/
! import com.sun.awt.AWTUtilities;
!
! import javax.swing.*;
! import java.awt.*;
import java.awt.image.BufferedImage;
public class bug6683775 {
static final int LOC = 100,
SIZE = 200;
public static void main(String[] args) throws Exception {
GraphicsConfiguration gc = getGC();
! if (!AWTUtilities.isTranslucencySupported(
! AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT)
! || gc == null) {
return;
}
Robot robot = new Robot();
final JFrame testFrame = new JFrame(gc);
--- 22,57 ----
*/
/*
* @test
* @key headful
! * @bug 6683775 6794764 8186617
! * @summary Painting artifacts is seen when panel is made setOpaque(false) for a
! * translucent window
*/
! import java.awt.Color;
! import java.awt.GraphicsConfiguration;
! import java.awt.GraphicsDevice;
! import java.awt.GraphicsEnvironment;
! import java.awt.Rectangle;
! import java.awt.Robot;
! import java.awt.Window;
import java.awt.image.BufferedImage;
+ import javax.swing.JFrame;
+ import javax.swing.JPanel;
+ import javax.swing.SwingUtilities;
+
public class bug6683775 {
static final int LOC = 100,
SIZE = 200;
public static void main(String[] args) throws Exception {
GraphicsConfiguration gc = getGC();
! if (gc == null || !gc.getDevice().isWindowTranslucencySupported(
! GraphicsDevice.WindowTranslucency.PERPIXEL_TRANSLUCENT)) {
return;
}
Robot robot = new Robot();
final JFrame testFrame = new JFrame(gc);
*** 63,73 ****
testFrame.setUndecorated(true);
JPanel p = new JPanel();
p.setOpaque(false);
testFrame.add(p);
! AWTUtilities.setWindowOpaque(testFrame, false);
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testFrame.setBounds(LOC, LOC, SIZE, SIZE);
testFrame.setVisible(true);
});
--- 66,76 ----
testFrame.setUndecorated(true);
JPanel p = new JPanel();
p.setOpaque(false);
testFrame.add(p);
! setOpaque(testFrame, false);
testFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
testFrame.setBounds(LOC, LOC, SIZE, SIZE);
testFrame.setVisible(true);
});
*** 76,106 ****
//robot.getPixelColor() didn't work right for some reason
BufferedImage capture =
robot.createScreenCapture(new Rectangle(LOC, LOC, SIZE, SIZE));
int redRGB = Color.RED.getRGB();
if (redRGB != capture.getRGB(SIZE/2, SIZE/2)) {
throw new RuntimeException("Transparent frame is not transparent!");
}
}
private static GraphicsConfiguration getGC() {
GraphicsConfiguration transparencyCapableGC =
GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice().getDefaultConfiguration();
! if (!AWTUtilities.isTranslucencyCapable(transparencyCapableGC)) {
transparencyCapableGC = null;
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] devices = env.getScreenDevices();
for (int i = 0; i < devices.length && transparencyCapableGC == null; i++) {
GraphicsConfiguration[] configs = devices[i].getConfigurations();
for (int j = 0; j < configs.length && transparencyCapableGC == null; j++) {
! if (AWTUtilities.isTranslucencyCapable(configs[j])) {
transparencyCapableGC = configs[j];
}
}
}
}
--- 79,120 ----
//robot.getPixelColor() didn't work right for some reason
BufferedImage capture =
robot.createScreenCapture(new Rectangle(LOC, LOC, SIZE, SIZE));
+ SwingUtilities.invokeAndWait(testFrame::dispose);
+
int redRGB = Color.RED.getRGB();
if (redRGB != capture.getRGB(SIZE/2, SIZE/2)) {
throw new RuntimeException("Transparent frame is not transparent!");
}
}
+ public static void setOpaque(Window window, boolean opaque) {
+ Color bg = window.getBackground();
+ if (bg == null) {
+ bg = new Color(0, 0, 0, 0);
+ }
+ window.setBackground(new Color(bg.getRed(), bg.getGreen(), bg.getBlue(),
+ opaque ? 255 : 0));
+ }
+
private static GraphicsConfiguration getGC() {
GraphicsConfiguration transparencyCapableGC =
GraphicsEnvironment.getLocalGraphicsEnvironment()
.getDefaultScreenDevice().getDefaultConfiguration();
! if (!transparencyCapableGC.isTranslucencyCapable()) {
transparencyCapableGC = null;
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice[] devices = env.getScreenDevices();
for (int i = 0; i < devices.length && transparencyCapableGC == null; i++) {
GraphicsConfiguration[] configs = devices[i].getConfigurations();
for (int j = 0; j < configs.length && transparencyCapableGC == null; j++) {
! if (configs[j].isTranslucencyCapable()) {
transparencyCapableGC = configs[j];
}
}
}
}
< prev index next >