8205144: JSpinner may change the font after became visible
authorserb
Sat, 23 Jun 2018 11:48:42 -0700
changeset 50833 97852c0a7a91
parent 50832 e069b9e49ca7
child 50834 9cf279436b9d
8205144: JSpinner may change the font after became visible Reviewed-by: psadhukhan
src/java.desktop/share/classes/javax/swing/JSpinner.java
test/jdk/javax/swing/JSpinner/6421058/bug6421058.java
test/jdk/javax/swing/JSpinner/WrongEditorTextFieldFont/FontByDefault.java
test/jdk/javax/swing/JSpinner/WrongEditorTextFieldFont/FontSetByLaF.java
test/jdk/javax/swing/JSpinner/WrongEditorTextFieldFont/FontSetByUser.java
test/jdk/javax/swing/JSpinner/WrongEditorTextFieldFont/WrongEditorTextFieldFont.java
--- a/src/java.desktop/share/classes/javax/swing/JSpinner.java	Fri Jun 22 19:19:43 2018 -0700
+++ b/src/java.desktop/share/classes/javax/swing/JSpinner.java	Sat Jun 23 11:48:42 2018 -0700
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2000, 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
@@ -29,6 +29,8 @@
 import java.awt.event.*;
 
 import javax.swing.event.*;
+import javax.swing.plaf.FontUIResource;
+import javax.swing.plaf.UIResource;
 import javax.swing.text.*;
 import javax.swing.plaf.SpinnerUI;
 
@@ -743,20 +745,32 @@
 
             Object source = e.getSource();
             String name = e.getPropertyName();
-            if ((source instanceof JFormattedTextField) && "value".equals(name)) {
-                Object lastValue = spinner.getValue();
+            if (source instanceof JFormattedTextField) {
+                if ("value".equals(name)) {
+                    Object lastValue = spinner.getValue();
 
-                // Try to set the new value
-                try {
-                    spinner.setValue(getTextField().getValue());
-                } catch (IllegalArgumentException iae) {
-                    // SpinnerModel didn't like new value, reset
+                    // Try to set the new value
                     try {
-                        ((JFormattedTextField)source).setValue(lastValue);
-                    } catch (IllegalArgumentException iae2) {
-                        // Still bogus, nothing else we can do, the
-                        // SpinnerModel and JFormattedTextField are now out
-                        // of sync.
+                        spinner.setValue(getTextField().getValue());
+                    } catch (IllegalArgumentException iae) {
+                        // SpinnerModel didn't like new value, reset
+                        try {
+                            ((JFormattedTextField)source).setValue(lastValue);
+                        } catch (IllegalArgumentException iae2) {
+                            // Still bogus, nothing else we can do, the
+                            // SpinnerModel and JFormattedTextField are now out
+                            // of sync.
+                        }
+                    }
+                } else if ("font".equals(name)) {
+                    Object newfont = e.getNewValue();
+                    if (newfont instanceof UIResource) {
+                        // The text field font must match the JSpinner font if
+                        // the text field font was not set by the user
+                        Font font = spinner.getFont();
+                        if (!newfont.equals(font)) {
+                            getTextField().setFont(new FontUIResource(font));
+                        }
                     }
                 }
             }
--- a/test/jdk/javax/swing/JSpinner/6421058/bug6421058.java	Fri Jun 22 19:19:43 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,95 +0,0 @@
-/*
- * Copyright (c) 2016, 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
- * @key headful
- * @bug 6421058
- * @summary Verify font of the text field is changed to the font of
- *          JSpinner if the font of text field was NOT set by the user
- * @run main bug6421058
- */
-
-import java.awt.Font;
-import javax.swing.JFrame;
-import javax.swing.JSpinner;
-import javax.swing.JSpinner.DefaultEditor;
-import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
-import javax.swing.UnsupportedLookAndFeelException;
-import javax.swing.plaf.UIResource;
-import static javax.swing.UIManager.getInstalledLookAndFeels;
-
-public class bug6421058 implements Runnable {
-
-    public static void main(final String[] args) throws Exception {
-        for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) {
-            SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
-            SwingUtilities.invokeAndWait(new bug6421058());
-        }
-    }
-
-    @Override
-    public void run() {
-        final JFrame mainFrame = new JFrame();
-        try {
-            testDefaultFont(mainFrame);
-        } finally {
-            mainFrame.dispose();
-        }
-    }
-
-    private static void testDefaultFont(final JFrame frame) {
-        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
-        JSpinner spinner = new JSpinner();
-        frame.add(spinner);
-        frame.setSize(300, 100);
-        frame.setVisible(true);
-
-        final DefaultEditor editor = (DefaultEditor) spinner.getEditor();
-        final Font editorFont = editor.getTextField().getFont();
-
-        /*
-         * Validate that the font of the text field is changed to the
-         * font of JSpinner if the font of text field was not set by the
-         * user.
-         */
-
-        if (!(editorFont instanceof UIResource)) {
-            throw new RuntimeException("Font must be UIResource");
-        }
-        if (!editorFont.equals(spinner.getFont())) {
-            throw new RuntimeException("Wrong FONT");
-        }
-    }
-
-    private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) {
-        try {
-            UIManager.setLookAndFeel(laf.getClassName());
-        } catch (ClassNotFoundException | InstantiationException |
-                UnsupportedLookAndFeelException | IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javax/swing/JSpinner/WrongEditorTextFieldFont/FontByDefault.java	Sat Jun 23 11:48:42 2018 -0700
@@ -0,0 +1,94 @@
+/*
+ * Copyright (c) 2016, 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
+ * @key headful
+ * @bug 6421058
+ * @summary Verify font of the text field is changed to the font of
+ *          JSpinner if the font of text field was NOT set by the user
+ */
+
+import java.awt.Font;
+import javax.swing.JFrame;
+import javax.swing.JSpinner;
+import javax.swing.JSpinner.DefaultEditor;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.plaf.UIResource;
+import static javax.swing.UIManager.getInstalledLookAndFeels;
+
+public class FontByDefault implements Runnable {
+
+    public static void main(final String[] args) throws Exception {
+        for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) {
+            SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
+            SwingUtilities.invokeAndWait(new FontByDefault());
+        }
+    }
+
+    @Override
+    public void run() {
+        final JFrame mainFrame = new JFrame();
+        try {
+            testDefaultFont(mainFrame);
+        } finally {
+            mainFrame.dispose();
+        }
+    }
+
+    private static void testDefaultFont(final JFrame frame) {
+        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+
+        JSpinner spinner = new JSpinner();
+        frame.add(spinner);
+        frame.setSize(300, 100);
+        frame.setVisible(true);
+
+        final DefaultEditor editor = (DefaultEditor) spinner.getEditor();
+        final Font editorFont = editor.getTextField().getFont();
+
+        /*
+         * Validate that the font of the text field is changed to the
+         * font of JSpinner if the font of text field was not set by the
+         * user.
+         */
+
+        if (!(editorFont instanceof UIResource)) {
+            throw new RuntimeException("Font must be UIResource");
+        }
+        if (!editorFont.equals(spinner.getFont())) {
+            throw new RuntimeException("Wrong FONT");
+        }
+    }
+
+    private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) {
+        try {
+            UIManager.setLookAndFeel(laf.getClassName());
+        } catch (ClassNotFoundException | InstantiationException |
+                UnsupportedLookAndFeelException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javax/swing/JSpinner/WrongEditorTextFieldFont/FontSetByLaF.java	Sat Jun 23 11:48:42 2018 -0700
@@ -0,0 +1,80 @@
+/*
+ * 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.
+ */
+
+import java.awt.EventQueue;
+import java.awt.Font;
+
+import javax.swing.JFormattedTextField;
+import javax.swing.JSpinner;
+import javax.swing.JSpinner.DefaultEditor;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+
+import static javax.swing.UIManager.getInstalledLookAndFeels;
+
+/**
+ * @test
+ * @key headful
+ * @bug 8205144
+ * @summary Verify font of the text field is changed to the font of
+ *          JSpinner if the font of text field was NOT set by the user and look
+ *          and feel tried to set it to default font of the TextUI
+ */
+public final class FontSetByLaF {
+
+    public static void main(final String[] args) throws Exception {
+        for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) {
+            EventQueue.invokeAndWait(() -> setLookAndFeel(laf));
+            EventQueue.invokeAndWait(() -> {
+
+                JSpinner spinner = new JSpinner();
+                DefaultEditor editor = (DefaultEditor) spinner.getEditor();
+                JFormattedTextField textField = editor.getTextField();
+
+                Font before = textField.getFont();
+                SwingUtilities.updateComponentTreeUI(spinner);
+                Font after = textField.getFont();
+
+                if (!before.equals(after)) {
+                    System.err.println("Before: " + before);
+                    System.err.println("After: " + after);
+                    throw new RuntimeException();
+                }
+            });
+        }
+    }
+
+    private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) {
+        try {
+            UIManager.setLookAndFeel(laf.getClassName());
+            System.err.println("LookAndFeel: " + laf.getClassName());
+        } catch (final UnsupportedLookAndFeelException ignored) {
+            System.err.println(
+                    "Unsupported LookAndFeel: " + laf.getClassName());
+        } catch (ClassNotFoundException | InstantiationException |
+                IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/jdk/javax/swing/JSpinner/WrongEditorTextFieldFont/FontSetByUser.java	Sat Jun 23 11:48:42 2018 -0700
@@ -0,0 +1,114 @@
+/*
+ * Copyright (c) 2015, 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.
+ */
+
+import java.awt.FlowLayout;
+import java.awt.Font;
+
+import javax.swing.JFrame;
+import javax.swing.JSpinner;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.plaf.UIResource;
+
+import static javax.swing.JSpinner.*;
+import static javax.swing.UIManager.getInstalledLookAndFeels;
+
+/**
+ * @test
+ * @key headful
+ * @bug 5036022
+ */
+public class FontSetByUser implements Runnable {
+
+    private static final Font USERS_FONT = new Font("dialog", Font.BOLD, 41);
+
+    public static void main(final String[] args) throws Exception {
+        for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) {
+            SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
+            SwingUtilities.invokeAndWait(new FontSetByUser());
+        }
+    }
+
+    @Override
+    public void run() {
+        final JFrame frame1 = new JFrame();
+        try {
+            testDefaultFont(frame1);
+        } finally {
+            frame1.dispose();
+        }
+    }
+
+    private static void testDefaultFont(final JFrame frame) {
+        final JSpinner spinner = new JSpinner();
+        final JSpinner spinner_u = new JSpinner();
+        frame.setLayout(new FlowLayout(FlowLayout.CENTER, 50, 50));
+        frame.getContentPane().add(spinner);
+        frame.getContentPane().add(spinner_u);
+        frame.pack();
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+        final DefaultEditor ed = (DefaultEditor) spinner.getEditor();
+        final DefaultEditor ed_u = (DefaultEditor) spinner_u.getEditor();
+        ed_u.getTextField().setFont(USERS_FONT);
+
+        for (int i = 5; i < 40; i += 5) {
+            /*
+             * Validate that the font of the text field is changed to the
+             * font of JSpinner if the font of text field was not set by the
+             * user.
+             */
+            final Font tff = ed.getTextField().getFont();
+            if (!(tff instanceof UIResource)) {
+                throw new RuntimeException("Font must be UIResource");
+            }
+            if (spinner.getFont().getSize() != tff.getSize()) {
+                throw new RuntimeException("Rrong size");
+            }
+            spinner.setFont(new Font("dialog", Font.BOLD, i));
+            /*
+             * Validate that the font of the text field is NOT changed to the
+             * font of JSpinner if the font of text field was set by the user.
+             */
+            final Font tff_u = ed_u.getTextField().getFont();
+            if (tff_u instanceof UIResource || !tff_u.equals(USERS_FONT)) {
+                throw new RuntimeException("Font must NOT be UIResource");
+            }
+            if (spinner_u.getFont().getSize() == tff_u.getSize()) {
+                throw new RuntimeException("Wrong size");
+            }
+            spinner_u.setFont(new Font("dialog", Font.BOLD, i));
+        }
+    }
+
+    private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) {
+        try {
+            UIManager.setLookAndFeel(laf.getClassName());
+            System.out.println("LookAndFeel: " + laf.getClassName());
+        } catch (ClassNotFoundException | InstantiationException |
+                UnsupportedLookAndFeelException | IllegalAccessException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}
--- a/test/jdk/javax/swing/JSpinner/WrongEditorTextFieldFont/WrongEditorTextFieldFont.java	Fri Jun 22 19:19:43 2018 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,115 +0,0 @@
-/*
- * Copyright (c) 2015, 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.
- */
-
-import java.awt.FlowLayout;
-import java.awt.Font;
-
-import javax.swing.JFrame;
-import javax.swing.JSpinner;
-import javax.swing.SwingUtilities;
-import javax.swing.UIManager;
-import javax.swing.UnsupportedLookAndFeelException;
-import javax.swing.plaf.UIResource;
-
-import static javax.swing.JSpinner.*;
-import static javax.swing.UIManager.getInstalledLookAndFeels;
-
-/**
- * @test
- * @key headful
- * @bug 5036022
- * @author Sergey Bylokhov
- */
-public class WrongEditorTextFieldFont implements Runnable {
-
-    private static final Font USERS_FONT = new Font("dialog", Font.BOLD, 41);
-
-    public static void main(final String[] args) throws Exception {
-        for (final UIManager.LookAndFeelInfo laf : getInstalledLookAndFeels()) {
-            SwingUtilities.invokeAndWait(() -> setLookAndFeel(laf));
-            SwingUtilities.invokeAndWait(new WrongEditorTextFieldFont());
-        }
-    }
-
-    @Override
-    public void run() {
-        final JFrame frame1 = new JFrame();
-        try {
-            testDefaultFont(frame1);
-        } finally {
-            frame1.dispose();
-        }
-    }
-
-    private static void testDefaultFont(final JFrame frame) {
-        final JSpinner spinner = new JSpinner();
-        final JSpinner spinner_u = new JSpinner();
-        frame.setLayout(new FlowLayout(FlowLayout.CENTER, 50, 50));
-        frame.getContentPane().add(spinner);
-        frame.getContentPane().add(spinner_u);
-        frame.pack();
-        frame.setLocationRelativeTo(null);
-        frame.setVisible(true);
-        final DefaultEditor ed = (DefaultEditor) spinner.getEditor();
-        final DefaultEditor ed_u = (DefaultEditor) spinner_u.getEditor();
-        ed_u.getTextField().setFont(USERS_FONT);
-
-        for (int i = 5; i < 40; i += 5) {
-            /*
-             * Validate that the font of the text field is changed to the
-             * font of JSpinner if the font of text field was not set by the
-             * user.
-             */
-            final Font tff = ed.getTextField().getFont();
-            if (!(tff instanceof UIResource)) {
-                throw new RuntimeException("Font must be UIResource");
-            }
-            if (spinner.getFont().getSize() != tff.getSize()) {
-                throw new RuntimeException("Rrong size");
-            }
-            spinner.setFont(new Font("dialog", Font.BOLD, i));
-            /*
-             * Validate that the font of the text field is NOT changed to the
-             * font of JSpinner if the font of text field was set by the user.
-             */
-            final Font tff_u = ed_u.getTextField().getFont();
-            if (tff_u instanceof UIResource || !tff_u.equals(USERS_FONT)) {
-                throw new RuntimeException("Font must NOT be UIResource");
-            }
-            if (spinner_u.getFont().getSize() == tff_u.getSize()) {
-                throw new RuntimeException("Wrong size");
-            }
-            spinner_u.setFont(new Font("dialog", Font.BOLD, i));
-        }
-    }
-
-    private static void setLookAndFeel(final UIManager.LookAndFeelInfo laf) {
-        try {
-            UIManager.setLookAndFeel(laf.getClassName());
-            System.out.println("LookAndFeel: " + laf.getClassName());
-        } catch (ClassNotFoundException | InstantiationException |
-                UnsupportedLookAndFeelException | IllegalAccessException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}