From d491847754ae287813d675ca56a440c077824502 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 21 Nov 2022 11:51:27 +0100 Subject: [PATCH 1/2] Fonts: support lazy font file loading (extends PRs #545 and #614) --- .../java/com/formdev/flatlaf/FlatLaf.java | 4 + .../com/formdev/flatlaf/util/FontUtils.java | 153 ++++++++++++++++++ flatlaf-demo/build.gradle.kts | 2 + .../com/formdev/flatlaf/demo/DemoFrame.java | 32 +--- .../com/formdev/flatlaf/demo/FlatLafDemo.java | 21 +++ flatlaf-fonts/flatlaf-fonts-inter/README.md | 40 ++++- .../flatlaf-fonts-inter/build.gradle.kts | 2 + .../flatlaf/fonts/inter/FlatInterFont.java | 98 ++++++++--- .../src/main/module-info/module-info.java | 1 + .../flatlaf-fonts-jetbrains-mono/README.md | 34 +++- .../build.gradle.kts | 2 + .../jetbrains_mono/FlatJetBrainsMonoFont.java | 62 ++++--- .../src/main/module-info/module-info.java | 1 + flatlaf-fonts/flatlaf-fonts-roboto/README.md | 40 ++++- .../flatlaf-fonts-roboto/build.gradle.kts | 2 + .../flatlaf/fonts/roboto/FlatRobotoFont.java | 100 +++++++++--- .../src/main/module-info/module-info.java | 1 + .../FlatModularAppTest JAR.launch | 10 +- .../build.gradle.kts | 2 + .../modular/app/FlatModularAppTest.java | 3 + .../src/main/module-info/module-info.java | 1 + .../flatlaf/testing/FlatFontsTest.java | 10 +- .../testing/FlatPaintingStringTest.java | 14 +- .../themeeditor/FlatThemeEditorPane.java | 5 +- .../themeeditor/FlatThemeFileEditor.java | 7 +- 25 files changed, 523 insertions(+), 124 deletions(-) create mode 100644 flatlaf-core/src/main/java/com/formdev/flatlaf/util/FontUtils.java 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 b39901ec9..0aab3e4a0 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/FlatLaf.java @@ -78,6 +78,7 @@ import com.formdev.flatlaf.ui.FlatRootPaneUI; import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.ui.FlatStylingSupport.StyleableUI; +import com.formdev.flatlaf.util.FontUtils; import com.formdev.flatlaf.util.GrayFilter; import com.formdev.flatlaf.util.LoggingFacade; import com.formdev.flatlaf.util.MultiResolutionImageSupport; @@ -663,6 +664,9 @@ private void initDefaultFont( UIDefaults defaults ) { } static FontUIResource createCompositeFont( String family, int style, int size ) { + // load lazy font family + FontUtils.loadFontFamily( family ); + // using StyleContext.getFont() here because it uses // sun.font.FontUtilities.getCompositeFontUIResource() // and creates a composite font that is able to display all Unicode characters diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/util/FontUtils.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/FontUtils.java new file mode 100644 index 000000000..91aa240dd --- /dev/null +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/util/FontUtils.java @@ -0,0 +1,153 @@ +/* + * Copyright 2022 FormDev Software GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.formdev.flatlaf.util; + +import java.awt.Font; +import java.awt.FontFormatException; +import java.awt.GraphicsEnvironment; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import javax.swing.plaf.UIResource; +import javax.swing.text.StyleContext; + +/** + * Utility methods for fonts. + * + * @author Karl Tauber + * @since 3 + */ +public class FontUtils +{ + private static Map loadersMap; + + /** + * Gets a composite font for the given family, style and size. + * A composite font that is able to display all Unicode characters. + * The font family is loaded if necessary via {@link #loadFontFamily(String)}. + *

+ * To get fonts derived from returned fonts, it is recommended to use one of the + * {@link Font#deriveFont} methods instead of invoking this method. + */ + public static Font getCompositeFont( String family, int style, int size ) { + loadFontFamily( family ); + + // using StyleContext.getFont() here because it uses + // sun.font.FontUtilities.getCompositeFontUIResource() + // and creates a composite font that is able to display all Unicode characters + Font font = StyleContext.getDefaultStyleContext().getFont( family, style, size ); + + // always return non-UIResource font to avoid side effects when using font + // because Swing uninstalls UIResource fonts when switching L&F + // (StyleContext.getFont() may return a UIResource) + if( font instanceof UIResource ) + font = font.deriveFont( font.getStyle() ); + + return font; + } + + /** + * Registers a font family for lazy loading via {@link #loadFontFamily(String)}. + *

+ * The given runnable is invoked when the given font family should be loaded. + * The runnable should invoke {@link #installFont(URL)} to load and register font(s) + * for the family. + * A family may consist of up to four font files for the supported font styles: + * regular (plain), italic, bold and bold-italic. + */ + public static void registerFontFamilyLoader( String family, Runnable loader ) { + if( loadersMap == null ) + loadersMap = new HashMap<>(); + loadersMap.put( family, loader ); + } + + /** + * Loads a font family previously registered via {@link #registerFontFamilyLoader(String, Runnable)}. + * If the family is already loaded or no londer is registered for that family, nothing happens. + */ + public static void loadFontFamily( String family ) { + if( !hasLoaders() ) + return; + + Runnable loader = loadersMap.remove( family ); + if( loader != null ) + loader.run(); + + if( loadersMap.isEmpty() ) + loadersMap = null; + } + + /** + * Loads a font file from the given url and registers it in the graphics environment. + * Uses {@link Font#createFont(int, InputStream)} and {@link GraphicsEnvironment#registerFont(Font)}. + */ + public static boolean installFont( URL url ) { + try( InputStream in = url.openStream() ) { + Font font = Font.createFont( Font.TRUETYPE_FONT, in ); + return GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont( font ); + } catch( FontFormatException | IOException ex ) { + LoggingFacade.INSTANCE.logSevere( "FlatLaf: Failed to install font " + url, ex ); + return false; + } + } + + /** + * Returns all font familiy names available in the graphics environment. + * This invokes {@link GraphicsEnvironment#getAvailableFontFamilyNames()} and + * appends families registered for lazy loading via {@link #registerFontFamilyLoader(String, Runnable)} + * to the result. + */ + public static String[] getAvailableFontFamilyNames() { + String[] availableFontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames(); + if( !hasLoaders() ) + return availableFontFamilyNames; + + // append families that are not yet loaded + ArrayList result = new ArrayList<>( availableFontFamilyNames.length + loadersMap.size() ); + for( String name : availableFontFamilyNames ) + result.add( name ); + for( String name : loadersMap.keySet() ) { + if( !result.contains( name ) ) + result.add( name ); + } + + return result.toArray( new String[result.size()] ); + } + + /** + * Returns all fonts available in the graphics environment. + * This first loads all families registered for lazy loading via {@link #registerFontFamilyLoader(String, Runnable)} + * and then invokes {@link GraphicsEnvironment#getAllFonts()}. + */ + public static Font[] getAllFonts() { + if( hasLoaders() ) { + // load all registered families + String[] families = loadersMap.keySet().toArray( new String[loadersMap.size()] ); + for( String family : families ) + loadFontFamily( family ); + } + + return GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); + } + + private static boolean hasLoaders() { + return loadersMap != null && !loadersMap.isEmpty(); + } +} diff --git a/flatlaf-demo/build.gradle.kts b/flatlaf-demo/build.gradle.kts index 925f2f523..f98ae1bf6 100644 --- a/flatlaf-demo/build.gradle.kts +++ b/flatlaf-demo/build.gradle.kts @@ -23,6 +23,7 @@ dependencies { implementation( project( ":flatlaf-core" ) ) implementation( project( ":flatlaf-extras" ) ) implementation( project( ":flatlaf-fonts-inter" ) ) + implementation( project( ":flatlaf-fonts-jetbrains-mono" ) ) implementation( project( ":flatlaf-fonts-roboto" ) ) implementation( project( ":flatlaf-intellij-themes" ) ) implementation( "com.miglayout:miglayout-swing:5.3" ) @@ -35,6 +36,7 @@ tasks { dependsOn( ":flatlaf-core:jar" ) dependsOn( ":flatlaf-extras:jar" ) dependsOn( ":flatlaf-fonts-inter:jar" ) + dependsOn( ":flatlaf-fonts-jetbrains-mono:jar" ) dependsOn( ":flatlaf-fonts-roboto:jar" ) dependsOn( ":flatlaf-intellij-themes:jar" ) // dependsOn( ":flatlaf-natives-jna:jar" ) diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java index fccdb1f13..d834b0a44 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/DemoFrame.java @@ -27,7 +27,6 @@ import java.util.prefs.Preferences; import javax.swing.*; import javax.swing.text.DefaultEditorKit; -import javax.swing.text.StyleContext; import com.formdev.flatlaf.FlatClientProperties; import com.formdev.flatlaf.FlatDarculaLaf; import com.formdev.flatlaf.FlatDarkLaf; @@ -43,15 +42,13 @@ import com.formdev.flatlaf.extras.FlatUIDefaultsInspector; import com.formdev.flatlaf.extras.components.FlatButton; import com.formdev.flatlaf.extras.components.FlatButton.ButtonType; -import com.formdev.flatlaf.fonts.inter.FlatInterFont; -import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; import com.formdev.flatlaf.icons.FlatAbstractIcon; import com.formdev.flatlaf.themes.FlatMacDarkLaf; import com.formdev.flatlaf.themes.FlatMacLightLaf; import com.formdev.flatlaf.extras.FlatSVGUtils; -import com.formdev.flatlaf.ui.FlatUIUtils; import com.formdev.flatlaf.ui.JBRCustomDecorations; import com.formdev.flatlaf.util.ColorFunctions; +import com.formdev.flatlaf.util.FontUtils; import com.formdev.flatlaf.util.LoggingFacade; import com.formdev.flatlaf.util.SystemInfo; import net.miginfocom.layout.ConstraintParser; @@ -66,15 +63,12 @@ class DemoFrame extends JFrame { private final String[] availableFontFamilyNames; - private boolean interFontInstalled; - private boolean robotoFontInstalled; private int initialFontMenuItemCount = -1; DemoFrame() { int tabIndex = DemoPrefs.getState().getInt( FlatLafDemo.KEY_TAB, 0 ); - availableFontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment() - .getAvailableFontFamilyNames().clone(); + availableFontFamilyNames = FontUtils.getAvailableFontFamilyNames().clone(); Arrays.sort( availableFontFamilyNames ); initComponents(); @@ -284,24 +278,10 @@ private void showHintsChanged() { private void fontFamilyChanged( ActionEvent e ) { String fontFamily = e.getActionCommand(); - // install Inter font on demand - if( fontFamily.equals( FlatInterFont.FAMILY ) && !interFontInstalled ) { - FlatInterFont.install(); - interFontInstalled = true; - } - - // install Roboto font on demand - if( fontFamily.equals( FlatRobotoFont.FAMILY ) && !robotoFontInstalled ) { - FlatRobotoFont.install(); - robotoFontInstalled = true; - } - FlatAnimatedLafChange.showSnapshot(); Font font = UIManager.getFont( "defaultFont" ); - Font newFont = StyleContext.getDefaultStyleContext().getFont( fontFamily, font.getStyle(), font.getSize() ); - // StyleContext.getFont() may return a UIResource, which would cause loosing user scale factor on Windows - newFont = FlatUIUtils.nonUIResource( newFont ); + Font newFont = FontUtils.getCompositeFont( fontFamily, font.getStyle(), font.getSize() ); UIManager.put( "defaultFont", newFont ); FlatLaf.updateUI(); @@ -368,10 +348,8 @@ void updateFontMenuItems() { ButtonGroup familiesGroup = new ButtonGroup(); for( String family : families ) { - if( Arrays.binarySearch( availableFontFamilyNames, family ) < 0 && - !family.equals( FlatInterFont.FAMILY ) && - !family.equals( FlatRobotoFont.FAMILY ) ) - continue; // not available + if( Arrays.binarySearch( availableFontFamilyNames, family ) < 0 ) + continue; // not available JCheckBoxMenuItem item = new JCheckBoxMenuItem( family ); item.setSelected( family.equals( currentFamily ) ); diff --git a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java index 2455e6376..42577b522 100644 --- a/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java +++ b/flatlaf-demo/src/main/java/com/formdev/flatlaf/demo/FlatLafDemo.java @@ -23,6 +23,9 @@ import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.extras.FlatInspector; import com.formdev.flatlaf.extras.FlatUIDefaultsInspector; +import com.formdev.flatlaf.fonts.inter.FlatInterFont; +import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; +import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; import com.formdev.flatlaf.util.SystemInfo; /** @@ -68,6 +71,24 @@ public static void main( String[] args ) { SwingUtilities.invokeLater( () -> { DemoPrefs.init( PREFS_ROOT_PATH ); + // install fonts for lazy loading + FlatInterFont.installLazy(); + FlatJetBrainsMonoFont.installLazy(); + FlatRobotoFont.installLazy(); + + // use Inter font by default +// FlatLaf.setPreferredFontFamily( FlatInterFont.FAMILY ); +// FlatLaf.setPreferredLightFontFamily( FlatInterFont.FAMILY_LIGHT ); +// FlatLaf.setPreferredSemiboldFontFamily( FlatInterFont.FAMILY_SEMIBOLD ); + + // use Roboto font by default +// FlatLaf.setPreferredFontFamily( FlatRobotoFont.FAMILY ); +// FlatLaf.setPreferredLightFontFamily( FlatRobotoFont.FAMILY_LIGHT ); +// FlatLaf.setPreferredSemiboldFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD ); + + // use JetBrains Mono font +// FlatLaf.setPreferredMonospacedFontFamily( FlatJetBrainsMonoFont.FAMILY ); + // application specific UI defaults FlatLaf.registerCustomDefaultsSource( "com.formdev.flatlaf.demo" ); diff --git a/flatlaf-fonts/flatlaf-fonts-inter/README.md b/flatlaf-fonts/flatlaf-fonts-inter/README.md index 71742928c..0f6466436 100644 --- a/flatlaf-fonts/flatlaf-fonts-inter/README.md +++ b/flatlaf-fonts/flatlaf-fonts-inter/README.md @@ -18,18 +18,29 @@ License: How to install? --------------- -Invoke the `install()` method once (e.g. in your `main()` method; on AWT -thread): +Invoke following once (e.g. in your `main()` method; on AWT thread). + +For lazy loading use: + +~~~java +FlatInterFont.installLazy(); +~~~ + +Or load immediately with: ~~~java FlatInterFont.install(); +// or +FlatInterFont.installBasic(); +FlatInterFont.installLight(); +FlatInterFont.installSemiBold(); ~~~ How to use? ----------- -Use as default font: +Use as application font (invoke before setting up FlatLaf): ~~~java FlatLaf.setPreferredFontFamily( FlatInterFont.FAMILY ); @@ -37,7 +48,7 @@ FlatLaf.setPreferredLightFontFamily( FlatInterFont.FAMILY_LIGHT ); FlatLaf.setPreferredSemiboldFontFamily( FlatInterFont.FAMILY_SEMIBOLD ); ~~~ -Create fonts: +Create single fonts: ~~~java // basic styles @@ -55,6 +66,27 @@ new Font( FlatInterFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 ); new Font( FlatInterFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 ); ~~~ +If using lazy loading, invoke one of following before creating the font: + +~~~java +FontUtils.loadFontFamily( FlatInterFont.FAMILY ); +FontUtils.loadFontFamily( FlatInterFont.FAMILY_LIGHT ); +FontUtils.loadFontFamily( FlatInterFont.FAMILY_SEMIBOLD ); +~~~ + +E.g.: + +~~~java +FontUtils.loadFontFamily( FlatInterFont.FAMILY ); +Font font = new Font( FlatInterFont.FAMILY, Font.PLAIN, 12 ); +~~~ + +Or use following: + +~~~java +Font font = FontUtils.getCompositeFont( FlatInterFont.FAMILY, Font.PLAIN, 12 ); +~~~ + Download -------- diff --git a/flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts b/flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts index a3658d48c..8e5b3c02c 100644 --- a/flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts +++ b/flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts @@ -31,6 +31,8 @@ plugins { } dependencies { + implementation( project( ":flatlaf-core" ) ) + testImplementation( "org.junit.jupiter:junit-jupiter-api:5.7.2" ) testImplementation( "org.junit.jupiter:junit-jupiter-params" ) testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) diff --git a/flatlaf-fonts/flatlaf-fonts-inter/src/main/java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java b/flatlaf-fonts/flatlaf-fonts-inter/src/main/java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java index b27d3ad7d..767763561 100644 --- a/flatlaf-fonts/flatlaf-fonts-inter/src/main/java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java +++ b/flatlaf-fonts/flatlaf-fonts-inter/src/main/java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java @@ -16,11 +16,7 @@ package com.formdev.flatlaf.fonts.inter; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.IOException; -import java.io.InputStream; +import com.formdev.flatlaf.util.FontUtils; /** * The Inter font family. @@ -31,19 +27,30 @@ * Font home page: https://rsms.me/inter/
* GitHub project: https://github.com/rsms/inter *

- * To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread): + * To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread). + *

+ * For lazy loading use: + *

{@code
+ * FlatInterFont.installLazy();
+ * }
+ *

+ * Or load immediately with: *

{@code
  * FlatInterFont.install();
+ * // or
+ * FlatInterFont.installBasic();
+ * FlatInterFont.installLight();
+ * FlatInterFont.installSemiBold();
  * }
*

- * Use as default font: + * Use as application font (invoke before setting up FlatLaf): *

{@code
  * FlatLaf.setPreferredFontFamily( FlatInterFont.FAMILY );
  * FlatLaf.setPreferredLightFontFamily( FlatInterFont.FAMILY_LIGHT );
  * FlatLaf.setPreferredSemiboldFontFamily( FlatInterFont.FAMILY_SEMIBOLD );
  * }
*

- * Create fonts: + * Create single fonts: *

{@code
  * new Font( FlatInterFont.FAMILY, Font.PLAIN, 12 );
  * new Font( FlatInterFont.FAMILY, Font.ITALIC, 12 );
@@ -54,6 +61,24 @@
  * new Font( FlatInterFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 );
  * new Font( FlatInterFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 );
  * }
+ *

+ * If using lazy loading, invoke one of following before creating the font: + *

{@code
+ * FontUtils.loadFontFamily( FlatInterFont.FAMILY );
+ * FontUtils.loadFontFamily( FlatInterFont.FAMILY_LIGHT );
+ * FontUtils.loadFontFamily( FlatInterFont.FAMILY_SEMIBOLD );
+ * }
+ *

+ * E.g.: + *

{@code
+ * FontUtils.loadFontFamily( FlatInterFont.FAMILY );
+ * Font font = new Font( FlatInterFont.FAMILY, Font.PLAIN, 12 );
+ * }
+ *

+ * Or use following: + *

{@code
+ * Font font = FontUtils.getCompositeFont( FlatInterFont.FAMILY, Font.PLAIN, 12 );
+ * }
* * @author Karl Tauber */ @@ -115,21 +140,61 @@ public class FlatInterFont private FlatInterFont() {} + /** + * Registers the fonts for lazy loading via {@link FontUtils#registerFontFamilyLoader(String, Runnable)}. + *

+ * This is the preferred method (when using FlatLaf) to avoid unnecessary loading of maybe unused fonts. + *

+ * Note: When using '{@code new Font(...)}', you need to first invoke + * {@link FontUtils#loadFontFamily(family)} to ensure that the font family is loaded. + * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(family, style, size)}, + * this is done automatically. + */ + public static void installLazy() { + FontUtils.registerFontFamilyLoader( FAMILY, FlatInterFont::installBasic ); + FontUtils.registerFontFamilyLoader( FAMILY_LIGHT, FlatInterFont::installLight ); + FontUtils.registerFontFamilyLoader( FAMILY_SEMIBOLD, FlatInterFont::installSemiBold ); + } + /** * Creates and registers the fonts for all styles. + *

+ * When using FlatLaf, consider using {@link #installLazy()}. */ public static void install() { - // basic styles + installBasic(); + installLight(); + installSemiBold(); + } + + /** + * Creates and registers the fonts for basic styles (regular, italic and bold). + *

+ * When using FlatLaf, consider using {@link #installLazy()}. + */ + public static void installBasic() { installStyle( STYLE_REGULAR ); installStyle( STYLE_ITALIC ); installStyle( STYLE_BOLD ); installStyle( STYLE_BOLD_ITALIC ); + } - // light + /** + * Creates and registers the fonts for light styles. + *

+ * When using FlatLaf, consider using {@link #installLazy()}. + */ + public static void installLight() { installStyle( STYLE_LIGHT ); installStyle( STYLE_LIGHT_ITALIC ); + } - // semibold + /** + * Creates and registers the fonts for semibold styles. + *

+ * When using FlatLaf, consider using {@link #installLazy()}. + */ + public static void installSemiBold() { installStyle( STYLE_SEMIBOLD ); installStyle( STYLE_SEMIBOLD_ITALIC ); } @@ -139,15 +204,6 @@ public static void install() { * See {@code STYLE_} constants. */ public static boolean installStyle( String name ) { - try( InputStream in = FlatInterFont.class.getResourceAsStream( name ) ) { - Font font = Font.createFont( Font.TRUETYPE_FONT, in ); - return GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont( font ); - } catch( FontFormatException ex ) { - ex.printStackTrace(); - return false; - } catch( IOException ex ) { - ex.printStackTrace(); - return false; - } + return FontUtils.installFont( FlatInterFont.class.getResource( name ) ); } } diff --git a/flatlaf-fonts/flatlaf-fonts-inter/src/main/module-info/module-info.java b/flatlaf-fonts/flatlaf-fonts-inter/src/main/module-info/module-info.java index 468755203..48b6d6f6c 100644 --- a/flatlaf-fonts/flatlaf-fonts-inter/src/main/module-info/module-info.java +++ b/flatlaf-fonts/flatlaf-fonts-inter/src/main/module-info/module-info.java @@ -19,6 +19,7 @@ */ module com.formdev.flatlaf.fonts.inter { requires java.desktop; + requires com.formdev.flatlaf; exports com.formdev.flatlaf.fonts.inter; diff --git a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/README.md b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/README.md index fb2c620e4..958c6dbbe 100644 --- a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/README.md +++ b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/README.md @@ -15,8 +15,15 @@ License: How to install? --------------- -Invoke the `install()` method once (e.g. in your `main()` method; on AWT -thread): +Invoke following once (e.g. in your `main()` method; on AWT thread). + +For lazy loading use: + +~~~java +FlatJetBrainsMonoFont.installLazy(); +~~~ + +Or load immediately with: ~~~java FlatJetBrainsMonoFont.install(); @@ -26,13 +33,13 @@ FlatJetBrainsMonoFont.install(); How to use? ----------- -Use as default monospaced font: +Use as application monospaced font (invoke before setting up FlatLaf): ~~~java FlatLaf.setPreferredMonospacedFontFamily( FlatJetBrainsMonoFont.FAMILY ); ~~~ -Create fonts: +Create single fonts: ~~~java // basic styles @@ -42,6 +49,25 @@ new Font( FlatJetBrainsMonoFont.FAMILY, Font.BOLD, 12 ); new Font( FlatJetBrainsMonoFont.FAMILY, Font.BOLD | Font.ITALIC, 12 ); ~~~ +If using lazy loading, invoke one of following before creating the font: + +~~~java +FontUtils.loadFontFamily( FlatJetBrainsMonoFont.FAMILY ); +~~~ + +E.g.: + +~~~java +FontUtils.loadFontFamily( FlatJetBrainsMonoFont.FAMILY ); +Font font = new Font( FlatJetBrainsMonoFont.FAMILY, Font.PLAIN, 12 ); +~~~ + +Or use following: + +~~~java +Font font = FontUtils.getCompositeFont( FlatJetBrainsMonoFont.FAMILY, Font.PLAIN, 12 ); +~~~ + Download -------- diff --git a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts index 2123dbc26..393520d1f 100644 --- a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts +++ b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts @@ -31,6 +31,8 @@ plugins { } dependencies { + implementation( project( ":flatlaf-core" ) ) + testImplementation( "org.junit.jupiter:junit-jupiter-api:5.7.2" ) testImplementation( "org.junit.jupiter:junit-jupiter-params" ) testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) diff --git a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/java/com/formdev/flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/java/com/formdev/flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java index 94a6ba1f7..8986a0765 100644 --- a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/java/com/formdev/flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java +++ b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/java/com/formdev/flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java @@ -16,11 +16,7 @@ package com.formdev.flatlaf.fonts.jetbrains_mono; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.IOException; -import java.io.InputStream; +import com.formdev.flatlaf.util.FontUtils; /** * The JetBrains Mono font family. @@ -28,23 +24,46 @@ * Font home page: https://www.jetbrains.com/mono
* GitHub project: https://github.com/JetBrains/JetBrainsMono *

- * To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread): + * To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread). + *

+ * For lazy loading use: + *

{@code
+ * FlatJetBrainsMonoFont.installLazy();
+ * }
+ *

+ * Or load immediately with: *

{@code
  * FlatJetBrainsMonoFont.install();
  * }
*

- * Use as default monospaced font: + * Use as application monospaced font (invoke before setting up FlatLaf): *

{@code
  * FlatLaf.setPreferredMonospacedFontFamily( FlatJetBrainsMonoFont.FAMILY );
  * }
*

- * Create fonts: + * Create single fonts: *

{@code
  * new Font( FlatJetBrainsMonoFont.FAMILY, Font.PLAIN, 12 );
  * new Font( FlatJetBrainsMonoFont.FAMILY, Font.ITALIC, 12 );
  * new Font( FlatJetBrainsMonoFont.FAMILY, Font.BOLD, 12 );
  * new Font( FlatJetBrainsMonoFont.FAMILY, Font.BOLD | Font.ITALIC, 12 );
  * }
+ *

+ * If using lazy loading, invoke following before creating the font: + *

{@code
+ * FontUtils.loadFontFamily( FlatJetBrainsMonoFont.FAMILY );
+ * }
+ *

+ * E.g.: + *

{@code
+ * FontUtils.loadFontFamily( FlatJetBrainsMonoFont.FAMILY );
+ * Font font = new Font( FlatJetBrainsMonoFont.FAMILY, Font.PLAIN, 12 );
+ * }
+ *

+ * Or use following: + *

{@code
+ * Font font = FontUtils.getCompositeFont( FlatJetBrainsMonoFont.FAMILY, Font.PLAIN, 12 );
+ * }
* * @author Karl Tauber */ @@ -76,8 +95,24 @@ public class FlatJetBrainsMonoFont private FlatJetBrainsMonoFont() {} + /** + * Registers the fonts for lazy loading via {@link FontUtils#registerFontFamilyLoader(String, Runnable)}. + *

+ * This is the preferred method (when using FlatLaf) to avoid unnecessary loading of maybe unused fonts. + *

+ * Note: When using '{@code new Font(...)}', you need to first invoke + * {@link FontUtils#loadFontFamily(family)} to ensure that the font family is loaded. + * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(family, style, size)}, + * this is done automatically. + */ + public static void installLazy() { + FontUtils.registerFontFamilyLoader( FAMILY, FlatJetBrainsMonoFont::install ); + } + /** * Creates and registers the fonts for all styles. + *

+ * When using FlatLaf, consider using {@link #installLazy()}. */ public static void install() { installStyle( STYLE_REGULAR ); @@ -91,15 +126,6 @@ public static void install() { * See {@code STYLE_} constants. */ public static boolean installStyle( String name ) { - try( InputStream in = FlatJetBrainsMonoFont.class.getResourceAsStream( name ) ) { - Font font = Font.createFont( Font.TRUETYPE_FONT, in ); - return GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont( font ); - } catch( FontFormatException ex ) { - ex.printStackTrace(); - return false; - } catch( IOException ex ) { - ex.printStackTrace(); - return false; - } + return FontUtils.installFont( FlatJetBrainsMonoFont.class.getResource( name ) ); } } diff --git a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/module-info/module-info.java b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/module-info/module-info.java index b3984c690..362791b68 100644 --- a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/module-info/module-info.java +++ b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/module-info/module-info.java @@ -19,6 +19,7 @@ */ module com.formdev.flatlaf.fonts.jetbrains_mono { requires java.desktop; + requires com.formdev.flatlaf; exports com.formdev.flatlaf.fonts.jetbrains_mono; diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/README.md b/flatlaf-fonts/flatlaf-fonts-roboto/README.md index 43bed2651..91094152f 100644 --- a/flatlaf-fonts/flatlaf-fonts-roboto/README.md +++ b/flatlaf-fonts/flatlaf-fonts-roboto/README.md @@ -15,18 +15,29 @@ License: How to install? --------------- -Invoke the `install()` method once (e.g. in your `main()` method; on AWT -thread): +Invoke following once (e.g. in your `main()` method; on AWT thread). + +For lazy loading use: + +~~~java +FlatRobotoFont.installLazy(); +~~~ + +Or load immediately with: ~~~java FlatRobotoFont.install(); +// or +FlatRobotoFont.installBasic(); +FlatRobotoFont.installLight(); +FlatRobotoFont.installSemiBold(); ~~~ How to use? ----------- -Use as default font: +Use as application font (invoke before setting up FlatLaf): ~~~java FlatLaf.setPreferredFontFamily( FlatRobotoFont.FAMILY ); @@ -34,7 +45,7 @@ FlatLaf.setPreferredLightFontFamily( FlatRobotoFont.FAMILY_LIGHT ); FlatLaf.setPreferredSemiboldFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD ); ~~~ -Create fonts: +Create single fonts: ~~~java // basic styles @@ -52,6 +63,27 @@ new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 ); new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 ); ~~~ +If using lazy loading, invoke one of following before creating the font: + +~~~java +FontUtils.loadFontFamily( FlatRobotoFont.FAMILY ); +FontUtils.loadFontFamily( FlatRobotoFont.FAMILY_LIGHT ); +FontUtils.loadFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD ); +~~~ + +E.g.: + +~~~java +FontUtils.loadFontFamily( FlatRobotoFont.FAMILY ); +Font font = new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 ); +~~~ + +Or use following: + +~~~java +Font font = FontUtils.getCompositeFont( FlatRobotoFont.FAMILY, Font.PLAIN, 12 ); +~~~ + Download -------- diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts b/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts index 238493ada..219fb489b 100644 --- a/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts +++ b/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts @@ -31,6 +31,8 @@ plugins { } dependencies { + implementation( project( ":flatlaf-core" ) ) + testImplementation( "org.junit.jupiter:junit-jupiter-api:5.7.2" ) testImplementation( "org.junit.jupiter:junit-jupiter-params" ) testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java index fbdbfaf72..c0111ccd6 100644 --- a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java +++ b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java @@ -16,11 +16,7 @@ package com.formdev.flatlaf.fonts.roboto; -import java.awt.Font; -import java.awt.FontFormatException; -import java.awt.GraphicsEnvironment; -import java.io.IOException; -import java.io.InputStream; +import com.formdev.flatlaf.util.FontUtils; /** * The Roboto font family. @@ -28,19 +24,30 @@ * Font home page: https://fonts.google.com/specimen/Roboto
* GitHub project: https://github.com/googlefonts/roboto *

- * To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread): + * To install the font, invoke following once (e.g. in your {@code main()} method; on AWT thread). + *

+ * For lazy loading use: + *

{@code
+ * FlatRobotoFont.installLazy();
+ * }
+ *

+ * Or load immediately with: *

{@code
  * FlatRobotoFont.install();
+ * // or
+ * FlatRobotoFont.installBasic();
+ * FlatRobotoFont.installLight();
+ * FlatRobotoFont.installSemiBold();
  * }
*

- * Use as default font: + * Use as application font (invoke before setting up FlatLaf): *

{@code
  * FlatLaf.setPreferredFontFamily( FlatRobotoFont.FAMILY );
  * FlatLaf.setPreferredLightFontFamily( FlatRobotoFont.FAMILY_LIGHT );
  * FlatLaf.setPreferredSemiboldFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD );
  * }
*

- * Create fonts: + * Create single fonts: *

{@code
  * new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
  * new Font( FlatRobotoFont.FAMILY, Font.ITALIC, 12 );
@@ -51,6 +58,24 @@
  * new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.PLAIN, 12 );
  * new Font( FlatRobotoFont.FAMILY_SEMIBOLD, Font.ITALIC, 12 );
  * }
+ *

+ * If using lazy loading, invoke one of following before creating the font: + *

{@code
+ * FontUtils.loadFontFamily( FlatRobotoFont.FAMILY );
+ * FontUtils.loadFontFamily( FlatRobotoFont.FAMILY_LIGHT );
+ * FontUtils.loadFontFamily( FlatRobotoFont.FAMILY_SEMIBOLD );
+ * }
+ *

+ * E.g.: + *

{@code
+ * FontUtils.loadFontFamily( FlatRobotoFont.FAMILY );
+ * Font font = new Font( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
+ * }
+ *

+ * Or use following: + *

{@code
+ * Font font = FontUtils.getCompositeFont( FlatRobotoFont.FAMILY, Font.PLAIN, 12 );
+ * }
* * @author Karl Tauber */ @@ -81,7 +106,7 @@ public class FlatRobotoFont public static final String FAMILY_LIGHT = "Roboto Light"; /** - * Family name for semibold styles. + * Family name for semibold (medium) styles. *

* Usage: *

{@code
@@ -112,21 +137,61 @@ public class FlatRobotoFont
 
 	private FlatRobotoFont() {}
 
+	/**
+	 * Registers the fonts for lazy loading via {@link FontUtils#registerFontFamilyLoader(String, Runnable)}.
+	 * 

+ * This is the preferred method (when using FlatLaf) to avoid unnecessary loading of maybe unused fonts. + *

+ * Note: When using '{@code new Font(...)}', you need to first invoke + * {@link FontUtils#loadFontFamily(family)} to ensure that the font family is loaded. + * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(family, style, size)}, + * this is done automatically. + */ + public static void installLazy() { + FontUtils.registerFontFamilyLoader( FAMILY, FlatRobotoFont::installBasic ); + FontUtils.registerFontFamilyLoader( FAMILY_LIGHT, FlatRobotoFont::installLight ); + FontUtils.registerFontFamilyLoader( FAMILY_SEMIBOLD, FlatRobotoFont::installSemiBold ); + } + /** * Creates and registers the fonts for all styles. + *

+ * When using FlatLaf, consider using {@link #installLazy()}. */ public static void install() { - // basic styles + installBasic(); + installLight(); + installSemiBold(); + } + + /** + * Creates and registers the fonts for basic styles (regular, italic and bold). + *

+ * When using FlatLaf, consider using {@link #installLazy()}. + */ + public static void installBasic() { installStyle( STYLE_REGULAR ); installStyle( STYLE_ITALIC ); installStyle( STYLE_BOLD ); installStyle( STYLE_BOLD_ITALIC ); + } - // light + /** + * Creates and registers the fonts for light styles. + *

+ * When using FlatLaf, consider using {@link #installLazy()}. + */ + public static void installLight() { installStyle( STYLE_LIGHT ); installStyle( STYLE_LIGHT_ITALIC ); + } - // semibold + /** + * Creates and registers the fonts for semibold (medium) styles. + *

+ * When using FlatLaf, consider using {@link #installLazy()}. + */ + public static void installSemiBold() { installStyle( STYLE_SEMIBOLD ); installStyle( STYLE_SEMIBOLD_ITALIC ); } @@ -136,15 +201,6 @@ public static void install() { * See {@code STYLE_} constants. */ public static boolean installStyle( String name ) { - try( InputStream in = FlatRobotoFont.class.getResourceAsStream( name ) ) { - Font font = Font.createFont( Font.TRUETYPE_FONT, in ); - return GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont( font ); - } catch( FontFormatException ex ) { - ex.printStackTrace(); - return false; - } catch( IOException ex ) { - ex.printStackTrace(); - return false; - } + return FontUtils.installFont( FlatRobotoFont.class.getResource( name ) ); } } diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java index 595c27508..82e57e216 100644 --- a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java +++ b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/module-info/module-info.java @@ -19,6 +19,7 @@ */ module com.formdev.flatlaf.fonts.roboto { requires java.desktop; + requires com.formdev.flatlaf; exports com.formdev.flatlaf.fonts.roboto; diff --git a/flatlaf-testing/flatlaf-testing-modular-app/FlatModularAppTest JAR.launch b/flatlaf-testing/flatlaf-testing-modular-app/FlatModularAppTest JAR.launch index 308826536..10856322a 100644 --- a/flatlaf-testing/flatlaf-testing-modular-app/FlatModularAppTest JAR.launch +++ b/flatlaf-testing/flatlaf-testing-modular-app/FlatModularAppTest JAR.launch @@ -1,5 +1,6 @@ + @@ -16,10 +17,11 @@ - - - - + + + + + diff --git a/flatlaf-testing/flatlaf-testing-modular-app/build.gradle.kts b/flatlaf-testing/flatlaf-testing-modular-app/build.gradle.kts index 75c4f8607..bfaf12441 100644 --- a/flatlaf-testing/flatlaf-testing-modular-app/build.gradle.kts +++ b/flatlaf-testing/flatlaf-testing-modular-app/build.gradle.kts @@ -22,9 +22,11 @@ plugins { dependencies { implementation( project( ":flatlaf-core" ) ) implementation( project( ":flatlaf-extras" ) ) + implementation( project( ":flatlaf-fonts-inter" ) ) } flatlafModuleInfo { dependsOn( ":flatlaf-core:jar" ) dependsOn( ":flatlaf-extras:jar" ) + dependsOn( ":flatlaf-fonts-inter:jar" ) } diff --git a/flatlaf-testing/flatlaf-testing-modular-app/src/main/java/com/formdev/flatlaf/testing/modular/app/FlatModularAppTest.java b/flatlaf-testing/flatlaf-testing-modular-app/src/main/java/com/formdev/flatlaf/testing/modular/app/FlatModularAppTest.java index d97429b20..301c5e6de 100644 --- a/flatlaf-testing/flatlaf-testing-modular-app/src/main/java/com/formdev/flatlaf/testing/modular/app/FlatModularAppTest.java +++ b/flatlaf-testing/flatlaf-testing-modular-app/src/main/java/com/formdev/flatlaf/testing/modular/app/FlatModularAppTest.java @@ -27,6 +27,7 @@ import com.formdev.flatlaf.FlatLightLaf; import com.formdev.flatlaf.extras.FlatSVGIcon; import com.formdev.flatlaf.extras.FlatSVGUtils; +import com.formdev.flatlaf.fonts.inter.FlatInterFont; /** * @author Karl Tauber @@ -35,6 +36,8 @@ public class FlatModularAppTest { public static void main( String[] args ) { SwingUtilities.invokeLater( () -> { + FlatInterFont.installBasic(); + FlatLaf.registerCustomDefaultsSource( FlatModularAppTest.class.getResource( "/com/formdev/flatlaf/testing/modular/app/themes/" ) ); FlatLightLaf.setup(); diff --git a/flatlaf-testing/flatlaf-testing-modular-app/src/main/module-info/module-info.java b/flatlaf-testing/flatlaf-testing-modular-app/src/main/module-info/module-info.java index 87e4d76e5..3316462b9 100644 --- a/flatlaf-testing/flatlaf-testing-modular-app/src/main/module-info/module-info.java +++ b/flatlaf-testing/flatlaf-testing-modular-app/src/main/module-info/module-info.java @@ -21,6 +21,7 @@ requires java.desktop; requires com.formdev.flatlaf; requires com.formdev.flatlaf.extras; + requires com.formdev.flatlaf.fonts.inter; requires com.kitfox.svg; exports com.formdev.flatlaf.testing.modular.app.plaf; diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatFontsTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatFontsTest.java index 1891bdd74..84b94a298 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatFontsTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatFontsTest.java @@ -19,13 +19,13 @@ import java.awt.Color; import java.awt.Component; import java.awt.Font; -import java.awt.GraphicsEnvironment; import java.util.Map; import java.util.TreeMap; import javax.swing.*; import com.formdev.flatlaf.fonts.inter.FlatInterFont; import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; +import com.formdev.flatlaf.util.FontUtils; import com.formdev.flatlaf.util.UIScale; import net.miginfocom.swing.*; @@ -37,9 +37,9 @@ public class FlatFontsTest { public static void main( String[] args ) { SwingUtilities.invokeLater( () -> { - FlatInterFont.install(); - FlatJetBrainsMonoFont.install(); - FlatRobotoFont.install(); + FlatInterFont.installLazy(); + FlatJetBrainsMonoFont.installLazy(); + FlatRobotoFont.installLazy(); FlatTestFrame frame = FlatTestFrame.create( args, "FlatFontsTest" ); frame.showFrame( FlatFontsTest::new ); @@ -49,7 +49,7 @@ public static void main( String[] args ) { FlatFontsTest() { initComponents(); - Font[] allFonts = GraphicsEnvironment.getLocalGraphicsEnvironment().getAllFonts(); + Font[] allFonts = FontUtils.getAllFonts(); TreeMap> familiesMap = new TreeMap<>(); for( Font font : allFonts ) { diff --git a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatPaintingStringTest.java b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatPaintingStringTest.java index d8702c410..94f6b8dad 100644 --- a/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatPaintingStringTest.java +++ b/flatlaf-testing/src/main/java/com/formdev/flatlaf/testing/FlatPaintingStringTest.java @@ -22,17 +22,16 @@ import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; -import java.awt.GraphicsEnvironment; import java.awt.Rectangle; import java.awt.geom.AffineTransform; import java.util.Arrays; import javax.swing.*; -import javax.swing.text.StyleContext; import com.formdev.flatlaf.FlatLaf; import com.formdev.flatlaf.FlatSystemProperties; import com.formdev.flatlaf.fonts.inter.FlatInterFont; import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; import com.formdev.flatlaf.fonts.roboto.FlatRobotoFont; +import com.formdev.flatlaf.util.FontUtils; import com.formdev.flatlaf.util.Graphics2DProxy; import com.formdev.flatlaf.util.HiDPIUtils; import com.formdev.flatlaf.util.JavaCompatibility; @@ -51,9 +50,9 @@ public static void main( String[] args ) { System.setProperty( "FlatLaf.debug.HiDPIUtils.useDebugScaleFactor", "true" ); SwingUtilities.invokeLater( () -> { - FlatInterFont.install(); - FlatJetBrainsMonoFont.install(); - FlatRobotoFont.install(); + FlatInterFont.installLazy(); + FlatJetBrainsMonoFont.installLazy(); + FlatRobotoFont.installLazy(); FlatTestFrame frame = FlatTestFrame.create( args, "FlatPaintingStringTest" ); @@ -67,8 +66,7 @@ public static void main( String[] args ) { FlatPaintingStringTest() { initComponents(); - String[] availableFontFamilyNames = GraphicsEnvironment.getLocalGraphicsEnvironment() - .getAvailableFontFamilyNames().clone(); + String[] availableFontFamilyNames = FontUtils.getAvailableFontFamilyNames().clone(); Arrays.sort( availableFontFamilyNames ); Font currentFont = UIManager.getFont( "Label.font" ); @@ -194,7 +192,7 @@ private void fontChanged() { if( font.getFamily().equals( family ) ) return; - Font newFont = StyleContext.getDefaultStyleContext().getFont( family, font.getStyle(), font.getSize() ); + Font newFont = FontUtils.getCompositeFont( family, font.getStyle(), font.getSize() ); UIManager.put( "defaultFont", newFont ); updateFontMetricsLabel(); diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeEditorPane.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeEditorPane.java index 199b32463..b256318b2 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeEditorPane.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeEditorPane.java @@ -34,7 +34,6 @@ import javax.swing.KeyStroke; import javax.swing.SwingUtilities; import javax.swing.UIManager; -import javax.swing.text.StyleContext; import org.fife.ui.autocomplete.AutoCompletion; import org.fife.ui.autocomplete.CompletionProvider; import org.fife.ui.rsyntaxtextarea.AbstractTokenMakerFactory; @@ -50,6 +49,7 @@ import org.fife.ui.rtextarea.RTextScrollPane; import org.fife.ui.rtextarea.SearchContext; import com.formdev.flatlaf.fonts.jetbrains_mono.FlatJetBrainsMonoFont; +import com.formdev.flatlaf.util.FontUtils; import com.formdev.flatlaf.util.UIScale; /** @@ -171,8 +171,7 @@ void updateFontSize( int sizeIncr ) { private static Font createEditorFont( int sizeIncr ) { int size = UIManager.getFont( "defaultFont" ).getSize() + sizeIncr; - StyleContext sc = StyleContext.getDefaultStyleContext(); - Font font = sc.getFont( FlatJetBrainsMonoFont.FAMILY, Font.PLAIN, size ); + Font font = FontUtils.getCompositeFont( FlatJetBrainsMonoFont.FAMILY, Font.PLAIN, size ); if( isFallbackFont( font ) ) { Font defaultFont = RTextArea.getDefaultFont(); font = defaultFont.deriveFont( (float) size ); diff --git a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java index 8910769c0..d54dbb1d7 100644 --- a/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java +++ b/flatlaf-theme-editor/src/main/java/com/formdev/flatlaf/themeeditor/FlatThemeFileEditor.java @@ -108,10 +108,9 @@ static void main( String[] args ) { System.setProperty( "user.language", "en" ); SwingUtilities.invokeLater( () -> { - if( SystemInfo.isJava_11_orLater ) - FlatInterFont.install(); - FlatJetBrainsMonoFont.install(); - FlatRobotoFont.install(); + FlatInterFont.installLazy(); + FlatJetBrainsMonoFont.installLazy(); + FlatRobotoFont.installLazy(); FlatLaf.registerCustomDefaultsSource( "com.formdev.flatlaf.themeeditor" ); From adf775361757afd3a1f4b612316c83c708abfb70 Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Mon, 21 Nov 2022 12:55:55 +0100 Subject: [PATCH 2/2] Fonts: fixed gradle build error and javadoc warnings --- flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts | 4 ++++ .../java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java | 4 ++-- flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts | 4 ++++ .../flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java | 4 ++-- flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts | 4 ++++ .../java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java | 4 ++-- 6 files changed, 18 insertions(+), 6 deletions(-) diff --git a/flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts b/flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts index 8e5b3c02c..dc7a37c42 100644 --- a/flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts +++ b/flatlaf-fonts/flatlaf-fonts-inter/build.gradle.kts @@ -38,6 +38,10 @@ dependencies { testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) } +flatlafModuleInfo { + dependsOn( ":flatlaf-core:jar" ) +} + java { withSourcesJar() withJavadocJar() diff --git a/flatlaf-fonts/flatlaf-fonts-inter/src/main/java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java b/flatlaf-fonts/flatlaf-fonts-inter/src/main/java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java index 767763561..2cc808a2a 100644 --- a/flatlaf-fonts/flatlaf-fonts-inter/src/main/java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java +++ b/flatlaf-fonts/flatlaf-fonts-inter/src/main/java/com/formdev/flatlaf/fonts/inter/FlatInterFont.java @@ -146,8 +146,8 @@ private FlatInterFont() {} * This is the preferred method (when using FlatLaf) to avoid unnecessary loading of maybe unused fonts. *

* Note: When using '{@code new Font(...)}', you need to first invoke - * {@link FontUtils#loadFontFamily(family)} to ensure that the font family is loaded. - * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(family, style, size)}, + * {@link FontUtils#loadFontFamily(String)} to ensure that the font family is loaded. + * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(String, int, int)}, * this is done automatically. */ public static void installLazy() { diff --git a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts index 393520d1f..5fdcb0480 100644 --- a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts +++ b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/build.gradle.kts @@ -38,6 +38,10 @@ dependencies { testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) } +flatlafModuleInfo { + dependsOn( ":flatlaf-core:jar" ) +} + java { withSourcesJar() withJavadocJar() diff --git a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/java/com/formdev/flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/java/com/formdev/flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java index 8986a0765..359883a09 100644 --- a/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/java/com/formdev/flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java +++ b/flatlaf-fonts/flatlaf-fonts-jetbrains-mono/src/main/java/com/formdev/flatlaf/fonts/jetbrains_mono/FlatJetBrainsMonoFont.java @@ -101,8 +101,8 @@ private FlatJetBrainsMonoFont() {} * This is the preferred method (when using FlatLaf) to avoid unnecessary loading of maybe unused fonts. *

* Note: When using '{@code new Font(...)}', you need to first invoke - * {@link FontUtils#loadFontFamily(family)} to ensure that the font family is loaded. - * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(family, style, size)}, + * {@link FontUtils#loadFontFamily(String)} to ensure that the font family is loaded. + * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(String, int, int)}, * this is done automatically. */ public static void installLazy() { diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts b/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts index 219fb489b..62654dd31 100644 --- a/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts +++ b/flatlaf-fonts/flatlaf-fonts-roboto/build.gradle.kts @@ -38,6 +38,10 @@ dependencies { testRuntimeOnly( "org.junit.jupiter:junit-jupiter-engine" ) } +flatlafModuleInfo { + dependsOn( ":flatlaf-core:jar" ) +} + java { withSourcesJar() withJavadocJar() diff --git a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java index c0111ccd6..459db02c9 100644 --- a/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java +++ b/flatlaf-fonts/flatlaf-fonts-roboto/src/main/java/com/formdev/flatlaf/fonts/roboto/FlatRobotoFont.java @@ -143,8 +143,8 @@ private FlatRobotoFont() {} * This is the preferred method (when using FlatLaf) to avoid unnecessary loading of maybe unused fonts. *

* Note: When using '{@code new Font(...)}', you need to first invoke - * {@link FontUtils#loadFontFamily(family)} to ensure that the font family is loaded. - * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(family, style, size)}, + * {@link FontUtils#loadFontFamily(String)} to ensure that the font family is loaded. + * When FlatLaf loads a font, or when using {@link FontUtils#getCompositeFont(String, int, int)}, * this is done automatically. */ public static void installLazy() {