8205144: JSpinner may change the font after became visible
Reviewed-by: psadhukhan
--- 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);
- }
- }
-}