Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java swing applications not rendering properly with VNC

Swing applications show a blank window when launched on a VNC desktop with Java 8. I don't have this problem with JRE 7 and non-swing applications (eg. Eclipse) runs properly with the same settings.

Are there some sort of default settings like 3D acceleration or something that have been enabled by default on JRE 8 ? How does i disable it ?

like image 674
AllanHawk Avatar asked Mar 07 '16 19:03

AllanHawk


2 Answers

TL;DR

  • Java and glxgears expect a color depth of 24.
  • Make sure that X and VNC are set to use a depth of 24 and not some other depth like 16 or 32.

Details:

I had blank Java windows in VNC too, but with Java 7 and Java 8, so it wasn't much of a surprise that disabling xrender didn't help me. That probably makes it a gross violation of StackOverflow protocol to post this here, but I found my way here, so surely others will too. -Dsun.java2d.opengl=true made the text visible, though the anti-aliasing was like something out of the 1980s with a messed up palette, but then I got spuriously transparent parts of windows, always the same parts, cleanly composited, so not like a driver bug. Noticing that glxgears was also displaying with a neat transparent background, when it's opaque black on other systems, I found a thoughtful and informative bug report against "compton", RGBA windows are always transparent #179. Inspired to look at xdpyinfo, I found my VNC server was offering "visuals" of depth 32 only, ie visuals with 8 bits each of red, green and blue and eight bits of alpha. It seems Java, and glxgears, want an opaque visual, so one of depth 24. My normal :0 X server has that as its default. For the -depth switch, man Xtigervnc says "Default is 24, other possible values are 8, 15, and 16 - anything else is likely to cause strange behaviour by applications", yet Debian's provisional packaging for TigerVNC, specifically in /etc/vnc.conf and /usr/bin/tigervncserver, sets it to a default of 32. -depth 24 and suddenly everything was beautiful again, with translucency only where it was requested. xdpyinfo revealed many "visuals" on offer, including depth 32.

like image 190
Martin Dorey Avatar answered Nov 20 '22 05:11

Martin Dorey


On a Linux system, I've found that using the -Dsun.java2d.xrender=false option solved the issue. I think that xrender is now enabled by default on Java 8.

System Properties for Java 2D can be found here : http://docs.oracle.com/javase/8/docs/technotes/guides/2d/flags.html

like image 8
AllanHawk Avatar answered Nov 20 '22 07:11

AllanHawk