8192888: AllSwingComponentsBaselineTest fails with NullPointerException for NimbusLookAndFeel
Reviewed-by: serb
--- a/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Wed Oct 24 14:59:21 2018 +0200
+++ b/src/java.desktop/share/classes/javax/swing/plaf/synth/SynthButtonUI.java Thu Oct 25 13:07:42 2018 +0530
@@ -25,6 +25,8 @@
package javax.swing.plaf.synth;
+import sun.awt.AppContext;
+
import javax.swing.*;
import java.awt.*;
import java.beans.*;
@@ -44,6 +46,8 @@
PropertyChangeListener, SynthUI {
private SynthStyle style;
+ private static final Object SYNTH_BUTTON_UI_KEY = new Object();
+
/**
* Creates a new UI object for the given component.
*
@@ -51,7 +55,14 @@
* @return the UI object
*/
public static ComponentUI createUI(JComponent c) {
- return new SynthButtonUI();
+ AppContext appContext = AppContext.getAppContext();
+ SynthButtonUI synthButtonUI =
+ (SynthButtonUI) appContext.get(SYNTH_BUTTON_UI_KEY);
+ if (synthButtonUI == null) {
+ synthButtonUI = new SynthButtonUI();
+ appContext.put(SYNTH_BUTTON_UI_KEY, synthButtonUI);
+ }
+ return synthButtonUI;
}
/**
@@ -206,7 +217,7 @@
// layout the text and icon
SynthContext context = getContext(b);
FontMetrics fm = context.getComponent().getFontMetrics(
- context.getStyle().getFont(context));
+ context.getStyle().getFont(context));
context.getStyle().getGraphicsUtils(context).layoutText(
context, fm, b.getText(), b.getIcon(),
b.getHorizontalAlignment(), b.getVerticalAlignment(),
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javax/swing/plaf/nimbus/AllSwingComponentsBaselineTest.java Thu Oct 25 13:07:42 2018 +0530
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/* @test
+ @bug 8192888
+ @summary Verifies getBaseline causes NPE for Nimbus L&F
+ @run main AllSwingComponentsBaselineTest
+ */
+
+import java.awt.FlowLayout;
+import javax.swing.JButton;
+import javax.swing.JFrame;
+import javax.swing.UIManager;
+import javax.swing.SwingUtilities;
+import javax.swing.plaf.basic.BasicButtonUI;
+
+public class AllSwingComponentsBaselineTest {
+ public static void main(String args[]) throws Exception {
+ for (UIManager.LookAndFeelInfo laf : UIManager.getInstalledLookAndFeels()) {
+ System.out.println("Test for LookAndFeel " + laf.getClassName());
+ UIManager.setLookAndFeel(laf.getClassName());
+ SwingUtilities.invokeAndWait(() -> test());
+ System.out.println("Test passed for LookAndFeel " + laf.getClassName());
+ }
+ }
+
+ public static void test() {
+ JFrame frame = null;
+ try {
+ frame = new JFrame();
+ JButton b = new JButton("test");
+ FlowLayout layout = new FlowLayout();
+ layout.setAlignOnBaseline(true);
+
+ frame.getContentPane().setLayout(layout);
+ frame.getContentPane().add(b);
+
+ BasicButtonUI bbUI = (BasicButtonUI) UIManager.getUI(b);
+ bbUI.getBaseline(b, b.getHeight(), b.getWidth());
+ } finally {
+ frame.dispose();
+ }
+ }
+}