From 581c64b601bacba1c241a250cbc1a5d46ea93299 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Wed, 23 Aug 2023 19:40:59 +0200 Subject: [PATCH] FileChooser: fixed occasional NPE in `FlatShortcutsPanel` on Windows (issue #718) --- CHANGELOG.md | 8 +++++ .../formdev/flatlaf/ui/FlatFileChooserUI.java | 32 ++++++++++++------- 2 files changed, 29 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c617175..bd1559d6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,14 @@ FlatLaf Change Log ================== +## 3.3-SNAPSHOT + +#### Fixed bugs + +- FileChooser: Fixed occasional NPE in `FlatShortcutsPanel` on Windows. (issue + #718) + + ## 3.2 #### New features and improvements diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatFileChooserUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatFileChooserUI.java index 70f57442..0434846e 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatFileChooserUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatFileChooserUI.java @@ -29,6 +29,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.lang.reflect.Method; +import java.util.ArrayList; import java.util.function.Function; import javax.swing.AbstractButton; import javax.swing.Box; @@ -408,7 +409,7 @@ public class FlatFileChooserUI protected final File[] files; protected final JToggleButton[] buttons; - protected final ButtonGroup buttonGroup; + protected final ButtonGroup buttonGroup = new ButtonGroup(); @SuppressWarnings( "unchecked" ) public FlatShortcutsPanel( JFileChooser fc ) { @@ -427,19 +428,22 @@ public class FlatFileChooserUI File[] files = getChooserShortcutPanelFiles( fsv ); if( filesFunction != null ) files = filesFunction.apply( files ); - this.files = files; // create toolbar buttons - buttons = new JToggleButton[files.length]; - buttonGroup = new ButtonGroup(); - for( int i = 0; i < files.length; i++ ) { - // wrap drive path - if( fsv.isFileSystemRoot( files[i] ) ) - files[i] = fsv.createFileObject( files[i].getAbsolutePath() ); + ArrayList filesList = new ArrayList<>(); + ArrayList buttonsList = new ArrayList<>(); + for( File file : files ) { + if( file == null ) + continue; + + // wrap drive path + if( fsv.isFileSystemRoot( file ) ) + file = fsv.createFileObject( file.getAbsolutePath() ); - File file = files[i]; String name = getDisplayName( fsv, file ); Icon icon = getIcon( fsv, file ); + if( name == null ) + continue; // remove path from name int lastSepIndex = name.lastIndexOf( File.separatorChar ); @@ -454,15 +458,21 @@ public class FlatFileChooserUI // create button JToggleButton button = createButton( name, icon ); + File f = file; button.addActionListener( e -> { - fc.setCurrentDirectory( file ); + fc.setCurrentDirectory( f ); } ); add( button ); buttonGroup.add( button ); - buttons[i] = button; + + filesList.add( file ); + buttonsList.add( button ); } + this.files = filesList.toArray( new File[filesList.size()] ); + this.buttons = buttonsList.toArray( new JToggleButton[buttonsList.size()] ); + directoryChanged( fc.getCurrentDirectory() ); }