From c7fa475128f09cd2c94ed7c9448585dafa9ba295 Mon Sep 17 00:00:00 2001 From: Nicolas Roduit Date: Fri, 18 Feb 2022 18:30:24 +0100 Subject: [PATCH 1/2] NPE when painting icon on OS X top menu bar #483 --- .../flatlaf/icons/FlatHelpButtonIcon.java | 4 +- .../flatlaf/icons/FlatMenuArrowIcon.java | 4 +- .../com/formdev/flatlaf/ui/FlatButtonUI.java | 4 +- .../flatlaf/ui/TestFlatIconNullComponent.java | 67 +++++++++++++++++++ 4 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatIconNullComponent.java diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java index f47ec90a..ed676e60 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatHelpButtonIcon.java @@ -96,8 +96,8 @@ public class FlatHelpButtonIcon */ - boolean enabled = c.isEnabled(); - boolean focused = FlatUIUtils.isPermanentFocusOwner( c ); + boolean enabled = c == null || c.isEnabled(); + boolean focused = c != null && FlatUIUtils.isPermanentFocusOwner( c ); float xy = 0.5f; float wh = iconSize() - 1; diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java index 637345d0..2ef0866b 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/icons/FlatMenuArrowIcon.java @@ -63,7 +63,7 @@ public class FlatMenuArrowIcon @Override protected void paintIcon( Component c, Graphics2D g ) { - if( !c.getComponentOrientation().isLeftToRight() ) + if(c != null && !c.getComponentOrientation().isLeftToRight() ) g.rotate( Math.toRadians( 180 ), width / 2., height / 2. ); g.setColor( getArrowColor( c ) ); @@ -82,7 +82,7 @@ public class FlatMenuArrowIcon if( c instanceof JMenu && ((JMenu)c).isSelected() && !isUnderlineSelection() ) return selectionForeground; - return c.isEnabled() ? arrowColor : disabledArrowColor; + return c == null || c.isEnabled() ? arrowColor : disabledArrowColor; } protected boolean isUnderlineSelection() { diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java index 34d9bc67..9f1c3280 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java @@ -573,7 +573,7 @@ public class FlatButtonUI public static Color buttonStateColor( Component c, Color enabledColor, Color disabledColor, Color focusedColor, Color hoverColor, Color pressedColor ) { - if( !c.isEnabled() ) + if(c != null && !c.isEnabled() ) return disabledColor; if( c instanceof AbstractButton ) { @@ -586,7 +586,7 @@ public class FlatButtonUI return hoverColor; } - if( focusedColor != null && isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c ) ) + if( c != null && focusedColor != null && isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c ) ) return focusedColor; return enabledColor; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatIconNullComponent.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatIconNullComponent.java new file mode 100644 index 00000000..ddf391d1 --- /dev/null +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatIconNullComponent.java @@ -0,0 +1,67 @@ +/* + * Copyright 2021 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.ui; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import javax.swing.Icon; +import com.formdev.flatlaf.icons.FlatHelpButtonIcon; +import com.formdev.flatlaf.icons.FlatMenuArrowIcon; +import com.formdev.flatlaf.icons.FlatSearchIcon; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +class TestFlatIconPaintingNullComponent +{ + static Graphics graphics; + + @BeforeAll + static void setup() { + TestUtils.setup( false ); + graphics = new BufferedImage( 32, 32, BufferedImage.TYPE_INT_ARGB ).getGraphics(); + graphics.setColor( Color.white ); + } + + @AfterAll + static void cleanup() { + TestUtils.cleanup(); + graphics = null; + } + + @Test + void flatHelpButtonIcon() { + paintWithoutException( new FlatHelpButtonIcon() ); + } + + @Test + void flatMenuArrowIcon() { + paintWithoutException(new FlatMenuArrowIcon()); + } + + @Test + void flatSearchIcon() { + paintWithoutException(new FlatSearchIcon()); + } + + private void paintWithoutException(Icon icon) { + graphics.clearRect( 0, 0, 32,32 ); + assertDoesNotThrow(() -> icon.paintIcon( null, graphics, 0, 0 )); + } +} From 016e515ae2038dfb7da783baa4cc42eb3542d1aa Mon Sep 17 00:00:00 2001 From: Karl Tauber Date: Fri, 25 Feb 2022 15:52:40 +0100 Subject: [PATCH 2/2] moved TestFlatIconNullComponent to other package and fixed file name (issue #483) --- CHANGELOG.md | 1 + .../com/formdev/flatlaf/ui/FlatButtonUI.java | 7 +++++-- .../TestFlatIconPaintingNullComponent.java} | 18 ++++++++---------- 3 files changed, 14 insertions(+), 12 deletions(-) rename flatlaf-core/src/test/java/com/formdev/flatlaf/{ui/TestFlatIconNullComponent.java => icons/TestFlatIconPaintingNullComponent.java} (74%) diff --git a/CHANGELOG.md b/CHANGELOG.md index eb3d1d07..a87e703f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ FlatLaf Change Log bounds. (issue #477) - Repaint component when setting client property `JComponent.outline` (issue #480). +- macOS: Fixed NPE when using some icons in main menu items. (issue #483) ## 2.0.1 diff --git a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java index 9f1c3280..1f970a7c 100644 --- a/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java +++ b/flatlaf-core/src/main/java/com/formdev/flatlaf/ui/FlatButtonUI.java @@ -573,7 +573,10 @@ public class FlatButtonUI public static Color buttonStateColor( Component c, Color enabledColor, Color disabledColor, Color focusedColor, Color hoverColor, Color pressedColor ) { - if(c != null && !c.isEnabled() ) + if( c == null ) + return enabledColor; + + if( !c.isEnabled() ) return disabledColor; if( c instanceof AbstractButton ) { @@ -586,7 +589,7 @@ public class FlatButtonUI return hoverColor; } - if( c != null && focusedColor != null && isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c ) ) + if( focusedColor != null && isFocusPainted( c ) && FlatUIUtils.isPermanentFocusOwner( c ) ) return focusedColor; return enabledColor; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatIconNullComponent.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/icons/TestFlatIconPaintingNullComponent.java similarity index 74% rename from flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatIconNullComponent.java rename to flatlaf-core/src/test/java/com/formdev/flatlaf/icons/TestFlatIconPaintingNullComponent.java index ddf391d1..a5c1ea6f 100644 --- a/flatlaf-core/src/test/java/com/formdev/flatlaf/ui/TestFlatIconNullComponent.java +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/icons/TestFlatIconPaintingNullComponent.java @@ -1,5 +1,5 @@ /* - * Copyright 2021 FormDev Software GmbH + * 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. @@ -14,15 +14,13 @@ * limitations under the License. */ -package com.formdev.flatlaf.ui; +package com.formdev.flatlaf.icons; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import javax.swing.Icon; -import com.formdev.flatlaf.icons.FlatHelpButtonIcon; -import com.formdev.flatlaf.icons.FlatMenuArrowIcon; -import com.formdev.flatlaf.icons.FlatSearchIcon; +import com.formdev.flatlaf.ui.TestUtils; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -52,16 +50,16 @@ class TestFlatIconPaintingNullComponent @Test void flatMenuArrowIcon() { - paintWithoutException(new FlatMenuArrowIcon()); + paintWithoutException( new FlatMenuArrowIcon() ); } @Test void flatSearchIcon() { - paintWithoutException(new FlatSearchIcon()); + paintWithoutException( new FlatSearchIcon() ); } - private void paintWithoutException(Icon icon) { - graphics.clearRect( 0, 0, 32,32 ); - assertDoesNotThrow(() -> icon.paintIcon( null, graphics, 0, 0 )); + private void paintWithoutException( Icon icon ) { + graphics.clearRect( 0, 0, 32, 32 ); + assertDoesNotThrow( () -> icon.paintIcon( null, graphics, 0, 0 ) ); } }