<AWT Dev> <Swing Dev> [9] Review request for JDK-8046559: NPE when changing Windows theme

Alexey Ivanov alexey.ivanov at oracle.com
Wed Jul 2 13:28:01 UTC 2014

Hi AWT, Swing teams,

Could you please review the fix to JDK-8046559 for jdk9:
     bug: https://bugs.openjdk.java.net/browse/JDK-8046559
     webrev: http://cr.openjdk.java.net/~aivanov/8046559/jdk9/webrev.00/

Problem description:
When changing Windows themes from a theme with visual styles (Windows 
Aero or Windows Basic) to a classic one, NullPointerException could be 
thrown from Swing code during component tree validation, or 
InternalError could be thrown during component painting.

Root cause:
Windows theme data are accessed via XPStyle and ThemeReader. When the 
theme is switched to a classic one, theme handles become unavailable, 
and theme data cannot be accessed any more. The change in theme is 
posted to EDT; at the same time, the UI often needs to repaint before 
the theme change is completely handled in Swing. This leads to NPE and 
InternalError as the code tries to access the data that has become 

The fix:
Windows desktop properties are updated right on Windows Toolkit thread, 
and the value of "win.xpstyle.themeActive" is stored in 
ThemeReader.xpStyleEnabled field. PropertyChangeEvents for desktop 
properties are delivered either synchronously on EDT or asynchronously 
via DesktopPropertyChangeSupport, as it used to be.

Getters in XPStyle class check for null values and return dummy defaults 
if ThemeReader returned null. SkinPainters also check whether theming is 
still available before asking ThemeReader to paint.

Access to XPStyle.xp instance is blocked as soon as user switches 
themes. The object will be cleaned when the corresponding 
PropertyChangeEvent is handled by Swing.

This new version of the fix addresses issues found with the initial 
submission of JDK-8039383 fix:
   - JDK-8046239: Build failure in 9-client on all non-Windows platforms
   - JDK-8046391: Hang displaying JFileChooser with Windows L&F

See also 
and http://cr.openjdk.java.net/~aivanov/8039383/jdk9/webrev.03/

Regression test:
No regression test is provided due to its complexity. Whether 
NullPointerException or InternalError are thrown depends on the order of 
event handling, sometimes exceptions do not occur when changing theme of 
visual styles enabled theme to a classic theme.

I included regression test for hang in JFileChooser, JDK-8046391.

Thank you,

More information about the awt-dev mailing list