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/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..bf75e736 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..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,6 +573,9 @@ public class FlatButtonUI public static Color buttonStateColor( Component c, Color enabledColor, Color disabledColor, Color focusedColor, Color hoverColor, Color pressedColor ) { + if( c == null ) + return enabledColor; + if( !c.isEnabled() ) return disabledColor; diff --git a/flatlaf-core/src/test/java/com/formdev/flatlaf/icons/TestFlatIconPaintingNullComponent.java b/flatlaf-core/src/test/java/com/formdev/flatlaf/icons/TestFlatIconPaintingNullComponent.java new file mode 100644 index 00000000..a5c1ea6f --- /dev/null +++ b/flatlaf-core/src/test/java/com/formdev/flatlaf/icons/TestFlatIconPaintingNullComponent.java @@ -0,0 +1,65 @@ +/* + * 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.icons; + +import java.awt.Color; +import java.awt.Graphics; +import java.awt.image.BufferedImage; +import javax.swing.Icon; +import com.formdev.flatlaf.ui.TestUtils; +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 ) ); + } +}