mirror of
https://github.com/JFormDesigner/FlatLaf.git
synced 2025-12-07 14:30:56 +03:00
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:
@@ -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.
|
||||||
|
|||||||
@@ -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 ) {
|
||||||
|
|||||||
Reference in New Issue
Block a user