FileChooser: catch NPE in Java 21 when getting icon for .exe files that use default Windows exe icon (see https://bugs.openjdk.org/browse/JDK-8320692)

This commit is contained in:
Karl Tauber
2024-01-08 20:29:20 +01:00
parent 45bdd40dce
commit a9ea9daec3
2 changed files with 36 additions and 24 deletions

View File

@@ -19,12 +19,15 @@ FlatLaf Change Log
- Button and ToggleButton: Selected buttons did not use explicitly set - Button and ToggleButton: Selected buttons did not use explicitly set
foreground color. (issue 756) foreground color. (issue 756)
- Table: Switching theme looses table grid and intercell spacing. (issues #733 - FileChooser: Catch NPE in Java 21 when getting icon for `.exe` files that use
and #750) default Windows exe icon. (see
[JDK-8320692](https://bugs.openjdk.org/browse/JDK-8320692))
- OptionPane: Fixed styling custom panel background in `JOptionPane`. (issue - OptionPane: Fixed styling custom panel background in `JOptionPane`. (issue
#761) #761)
- ScrollPane: Styling ScrollPane border properties did not work if view - ScrollPane: Styling ScrollPane border properties did not work if view
component is a Table. component is a Table.
- Table: Switching theme looses table grid and intercell spacing. (issues #733
and #750)
- Table: Fixed background of `boolean` columns when using alternating row - Table: Fixed background of `boolean` columns when using alternating row
colors. (issue #780) colors. (issue #780)
- TableHeader: No longer temporary replace header cell renderer while painting. - TableHeader: No longer temporary replace header cell renderer while painting.

View File

@@ -370,7 +370,11 @@ public class FlatFileChooserUI
// get system icon // get system icon
if( f != null ) { if( f != null ) {
icon = getFileChooser().getFileSystemView().getSystemIcon( f ); try {
icon = getFileChooser().getFileSystemView().getSystemIcon( f );
} catch( NullPointerException ex ) {
// Java 21 may throw a NPE for exe files that use default Windows exe icon
}
if( icon != null ) { if( icon != null ) {
if( icon instanceof ImageIcon ) if( icon instanceof ImageIcon )
@@ -540,31 +544,36 @@ public class FlatFileChooserUI
if( doNotUseSystemIcons() ) if( doNotUseSystemIcons() )
return new FlatFileViewDirectoryIcon(); return new FlatFileViewDirectoryIcon();
// Java 17+ supports getting larger system icons
try { try {
if( SystemInfo.isJava_17_orLater ) { // Java 17+ supports getting larger system icons
Method m = fsv.getClass().getMethod( "getSystemIcon", File.class, int.class, int.class ); try {
return (Icon) m.invoke( fsv, file, iconSize.width, iconSize.height ); if( SystemInfo.isJava_17_orLater ) {
} else if( iconSize.width > 16 || iconSize.height > 16 ) { Method m = fsv.getClass().getMethod( "getSystemIcon", File.class, int.class, int.class );
Class<?> cls = Class.forName( "sun.awt.shell.ShellFolder" ); return (Icon) m.invoke( fsv, file, iconSize.width, iconSize.height );
if( cls.isInstance( file ) ) { } else if( iconSize.width > 16 || iconSize.height > 16 ) {
Method m = file.getClass().getMethod( "getIcon", boolean.class ); Class<?> cls = Class.forName( "sun.awt.shell.ShellFolder" );
m.setAccessible( true ); if( cls.isInstance( file ) ) {
Image image = (Image) m.invoke( file, true ); Method m = file.getClass().getMethod( "getIcon", boolean.class );
if( image != null ) m.setAccessible( true );
return new ImageIcon( image ); Image image = (Image) m.invoke( file, true );
if( image != null )
return new ImageIcon( image );
}
} }
} catch( Exception ex ) {
// do not log InaccessibleObjectException because access
// may be denied via VM option '--illegal-access=deny' (default in Java 16)
// (not catching InaccessibleObjectException here because it is new in Java 9, but FlatLaf also runs on Java 8)
if( !"java.lang.reflect.InaccessibleObjectException".equals( ex.getClass().getName() ) )
LoggingFacade.INSTANCE.logSevere( null, ex );
} }
} catch( Exception ex ) {
// do not log InaccessibleObjectException because access
// may be denied via VM option '--illegal-access=deny' (default in Java 16)
// (not catching InaccessibleObjectException here because it is new in Java 9, but FlatLaf also runs on Java 8)
if( !"java.lang.reflect.InaccessibleObjectException".equals( ex.getClass().getName() ) )
LoggingFacade.INSTANCE.logSevere( null, ex );
}
// get system icon in default size 16x16 // get system icon in default size 16x16
return fsv.getSystemIcon( file ); return fsv.getSystemIcon( file );
} catch( NullPointerException ex ) {
// Java 21 may throw a NPE for exe files that use default Windows exe icon
return new FlatFileViewDirectoryIcon();
}
} }
protected void directoryChanged( File file ) { protected void directoryChanged( File file ) {