<AWT Dev> Translucency support in Swing with OpenGL

Phil Race philip.race at oracle.com
Fri Dec 6 20:20:27 UTC 2019


Hi,

opengl is not the default on Linux and doesn't get much usage or testing.
Could be a JDK bug or could be a driver bug.
If you think it is a bug you can file one at java.com,
But if you can find the problem you can contribute a fix.
See http://openjdk.java.net/contribute/

-phil.

On 12/6/19 12:11 PM, Florent Lioult wrote:
>
> Hi,
>
> I’m having troubles figuring to which extent full translucency (down 
> to the desktop background) is supported by Swing. Behaviors are not 
> the same depending on the component used (light or heavy), the JDK, as 
> well as the graphics card. For instance, why the following simple 
> example requires a JDK > 8?
>
> Using a newer JDK, things mostly work fine (on Linux). I’ve got 
> flickering issues, but my main problem is that setting the 
> "sun.java2d.opengl" breaks everything. It seems like the underlying 
> FBO created don’t have any alpha channel at all. The final texture 
> used by the desktop compositor is not alpha-premultiplied and have a 
> global 0.0 or 1.0 alpha value (I’ve seen both cases). However, I 
> didn’t found any known issue describing this basic problem. Am I 
> missing something obvious in my code here?
>
> - Florent
>
>
>
>
> // Start of code
>
> import java.awt.BorderLayout;
> import java.awt.Color;
> import java.awt.Graphics;
> import java.awt.Graphics2D;
> import java.awt.GraphicsDevice;
> import java.awt.GraphicsDevice.WindowTranslucency;
> import java.awt.Rectangle;
>
> import javax.swing.JButton;
> import javax.swing.JFrame;
> import javax.swing.JLabel;
> import javax.swing.JPanel;
> import javax.swing.Timer;
> import javax.swing.WindowConstants;
> import javax.swing.border.EmptyBorder;
>
> public class SimpleTranslucentFrame {
>
>     @SuppressWarnings("serial")
>     public static void main(String[] args) {
>
>         String openglPropertyName = "sun.java2d.opengl";
>         JLabel openglLabel = new JLabel(openglPropertyName + "=" + 
> System.getProperty(openglPropertyName, "false"));
>
>         JLabel swingLabel = new JLabel("Swing");
> swingLabel.setFont(swingLabel.getFont().deriveFont(48f));
>         new Timer(500, e -> swingLabel.setText(new 
> StringBuilder(swingLabel.getText()).reverse().toString())).start();
>
>         JButton closeButton = new JButton("Fermer");
>         closeButton.addActionListener(event -> System.exit(0));
>
>         JPanel panel = new JPanel(new BorderLayout(10, 10));
>         panel.setBorder(new EmptyBorder(10, 10, 10, 10));
>         panel.setOpaque(false);
>         panel.add(openglLabel, BorderLayout.NORTH);
>         panel.add(swingLabel);
>         panel.add(closeButton, BorderLayout.SOUTH);
>
>         // Required custom content pane (a JDK > 8 is also required).
>         JPanel contentPane = new JPanel(new BorderLayout()) {
>             @Override
>             public void paint(Graphics g) {
>                 ((Graphics2D) g).setBackground(getBackground());
>                 Rectangle clipBounds = g.getClipBounds();
>                 g.clearRect(clipBounds.x, clipBounds.y, 
> clipBounds.width, clipBounds.height);
>                 super.paint(g);
>             }
>         };
>         contentPane.setBackground(new Color(0, 0, 0, 0));
>         contentPane.setOpaque(false);
>
>         JFrame frame = new JFrame();
>         GraphicsDevice 
> device=frame.getGraphicsConfiguration().getDevice();
>         // Fun fact: PERPIXEL_TRANSLUCENT =/=> TRANSLUCENT (with a 
> Nvidia Quadro 4000)
>         assert 
> device.isWindowTranslucencySupported(WindowTranslucency.PERPIXEL_TRANSLUCENT);
>         frame.setUndecorated(true);
>         frame.setBackground(new Color(0, 0, 0, 0));
>         frame.setContentPane(contentPane);
>         frame.add(panel);
> frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
>         frame.pack();
>         frame.setLocationRelativeTo(null);
>         frame.setVisible(true);
>     }
> }
>
> // End of code
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.java.net/pipermail/awt-dev/attachments/20191206/e7922a65/attachment.html>


More information about the awt-dev mailing list