From d59d38dc7c0d16380fcb253465de4adb47d6fc01 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 12 Nov 2021 17:00:26 +0100 Subject: [PATCH] added method `FlatLaf.registerCustomDefaultsSource(URL packageUrl)` for JPMS (issue #325) --- CHANGELOG.md | 2 ++ .../java/com/formdev/flatlaf/FlatLaf.java | 28 +++++++++++++++++++ .../com/formdev/flatlaf/UIDefaultsLoader.java | 14 ++++++++++ 3 files changed, 44 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1d5fdc86..dc868857 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -50,6 +50,8 @@ FlatLaf Change Log applications: `lighten()`, `darken()`, `saturate()`, `desaturate()`, `spin()`, `tint()`, `shade()` and `luma()`. - Support defining fonts in FlatLaf properties files. (issue #384) +- Added method `FlatLaf.registerCustomDefaultsSource(URL packageUrl)` for JPMS. + (issue #325) - Extras: - Added class `FlatDesktop` for easy integration into macOS screen menu (About, Preferences and Quit) when using Java 8. diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java index 8927649f..54ca5c34 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -31,6 +31,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.File; import java.lang.reflect.Method; +import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; @@ -753,6 +754,7 @@ public abstract class FlatLaf * Invoke this method before setting the look and feel. *

* If using Java modules, the package must be opened in {@code module-info.java}. + * Otherwise use {@link #registerCustomDefaultsSource(URL)}. * * @param packageName a package name (e.g. "com.myapp.resources") */ @@ -794,6 +796,32 @@ public abstract class FlatLaf } } + /** + * Registers a package where FlatLaf searches for properties files with custom UI defaults. + *

+ * See {@link #registerCustomDefaultsSource(String)} for details. + *

+ * This method is useful if using Java modules and the package containing the properties files + * is not opened in {@code module-info.java}. + * E.g. {@code FlatLaf.registerCustomDefaultsSource( MyApp.class.getResource( "/com/myapp/themes/" ) )}. + * + * @param packageUrl a package URL + * @since 2 + */ + public static void registerCustomDefaultsSource( URL packageUrl ) { + if( customDefaultsSources == null ) + customDefaultsSources = new ArrayList<>(); + customDefaultsSources.add( packageUrl ); + } + + /** @since 2 */ + public static void unregisterCustomDefaultsSource( URL packageUrl ) { + if( customDefaultsSources == null ) + return; + + customDefaultsSources.remove( packageUrl ); + } + /** * Registers a folder where FlatLaf searches for properties files with custom UI defaults. *

diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java index 38b7e118..cebcf2de 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/UIDefaultsLoader.java @@ -22,10 +22,12 @@ import java.awt.Font; import java.awt.Insets; import java.io.File; import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.StreamTokenizer; import java.io.StringReader; +import java.net.URL; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -156,6 +158,18 @@ class UIDefaultsLoader properties.load( in ); } } + } else if( source instanceof URL ) { + // load from package URL + URL packageUrl = (URL) source; + for( Class lafClass : lafClasses ) { + URL propertiesUrl = new URL( packageUrl + lafClass.getSimpleName() + ".properties" ); + + try( InputStream in = propertiesUrl.openStream() ) { + properties.load( in ); + } catch( FileNotFoundException ex ) { + // ignore + } + } } else if( source instanceof File ) { // load from folder File folder = (File) source;