diff --git a/test/jdk/javax/swing/JMenuItem/MenuItemTest/MenuItemTestHelper.java b/test/jdk/javax/swing/JMenuItem/MenuItemTest/MenuItemTestHelper.java new file mode 100644 index 0000000000000..16b8749058555 --- /dev/null +++ b/test/jdk/javax/swing/JMenuItem/MenuItemTest/MenuItemTestHelper.java @@ -0,0 +1,163 @@ +/* + * Copyright (c) 2005, 2025, 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.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.ComponentOrientation; +import java.awt.Graphics; +import java.awt.event.KeyEvent; +import javax.swing.Icon; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JRadioButtonMenuItem; +import javax.swing.KeyStroke; +import javax.swing.UIManager; + +final class MenuItemTestHelper { + + public static JFrame getMenuItemTestFrame(boolean isLeft, String lafName) { + boolean applyLookAndFeel = lafName != null; + if (applyLookAndFeel) { + try { + UIManager.setLookAndFeel(lafName); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + Icon myIcon = new ColoredIcon(Color.RED, 10, 10); + Icon myIcon2 = new ColoredIcon(Color.GREEN, 15, 10); + + JMenuBar menuBar = new JMenuBar(); + menuBar.add(createViewMenu(myIcon, myIcon2)); + menuBar.add(createNoNothingMenu()); + menuBar.add(createSomeIconsMenu(myIcon, myIcon2)); + + String title = (isLeft ? "(Left-to-right)" : "(Right-to-left)") + " - Menu Item Test"; + JFrame frame = new JFrame(title); + frame.setJMenuBar(menuBar); + frame.applyComponentOrientation(isLeft + ? ComponentOrientation.LEFT_TO_RIGHT + : ComponentOrientation.RIGHT_TO_LEFT); + + if (applyLookAndFeel) { + String shortName = lafName.substring(lafName.lastIndexOf('.') + 1); + JLabel label = new JLabel("

" + shortName + "

"); + frame.setLayout(new BorderLayout()); + frame.add(label, BorderLayout.CENTER); + } + + frame.setSize(300, 300); + return frame; + } + + public static JFrame getMenuItemTestFrame(boolean isLeft) { + return getMenuItemTestFrame(isLeft, null); + } + + private static JMenu createViewMenu(Icon myIcon, Icon myIcon2) { + JMenu menu = new JMenu("View"); + menu.setMnemonic('V'); + menu.add(new JMenuItem("Refresh")); + menu.add(new JMenuItem("Customize...")); + menu.add(new JCheckBoxMenuItem("Show Toolbar")); + menu.addSeparator(); + menu.add(new JRadioButtonMenuItem("List")); + menu.add(new JRadioButtonMenuItem("Icons")); + + JRadioButtonMenuItem rm2 = new JRadioButtonMenuItem("And icon."); + rm2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, KeyEvent.SHIFT_DOWN_MASK)); + rm2.setIcon(myIcon2); + menu.add(rm2); + + JRadioButtonMenuItem mi3 = new JRadioButtonMenuItem("Radio w/icon"); + mi3.setIcon(myIcon); + menu.add(mi3); + + menu.add(new JMenuItem(myIcon2)); + + JMenuItem mi4 = new JMenuItem("Item with icon"); + mi4.setIcon(myIcon); + menu.addSeparator(); + menu.add(mi4); + + return menu; + } + + private static JMenu createNoNothingMenu() { + final JMenu noMenu = new JMenu("No nothing"); + + for (String label : new String[]{"One", "Two", "Threeee"}) { + JMenuItem item = new JMenuItem(label); + item.addActionListener((e) -> + PassFailJFrame.log("menu.width = " + + noMenu.getPopupMenu().getWidth())); + noMenu.add(item); + } + + return noMenu; + } + + private static JMenu createSomeIconsMenu(Icon myIcon, Icon myIcon2) { + JMenu someIcons = new JMenu("Some icons"); + + JMenuItem imi1 = new JMenuItem("Icon!"); + imi1.setIcon(myIcon); + someIcons.add(imi1); + + JMenuItem imi2 = new JMenuItem("Wide icon!"); + imi2.setIcon(myIcon2); + someIcons.add(imi2); + + someIcons.add(new JCheckBoxMenuItem("CheckBox")); + someIcons.add(new JRadioButtonMenuItem("RadioButton")); + + return someIcons; + } + + private record ColoredIcon(Color color, int width, int height) + implements Icon { + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + Color oldColor = g.getColor(); + g.setColor(color); + g.fillRect(x, y, width, height); + g.setColor(oldColor); + } + + @Override + public int getIconWidth() { + return width; + } + + @Override + public int getIconHeight() { + return height; + } + } +} diff --git a/test/jdk/javax/swing/JMenuItem/MenuItemTest/bug4729669.java b/test/jdk/javax/swing/JMenuItem/MenuItemTest/bug4729669.java new file mode 100644 index 0000000000000..6518b6b8fae53 --- /dev/null +++ b/test/jdk/javax/swing/JMenuItem/MenuItemTest/bug4729669.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2005, 2025, 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 4729669 + * @summary 1.4 REGRESSION: Text edge of different types of JMenuItems are not aligned + * @library /java/awt/regtesthelpers + * @build PassFailJFrame + * @run main/manual bug4729669 + */ + +import java.util.List; +import javax.swing.JFrame; + +public class bug4729669 { + + private static final String INSTRUCTIONS = """ + Two windows should appear: Left-to-right and Right-to-left. + Check that text on all the menu items of all menus + is properly vertically aligned."""; + + public static void main(String[] args) throws Exception { + PassFailJFrame.builder() + .title("bug4729669 Instructions") + .instructions(INSTRUCTIONS) + .columns(35) + .testUI(bug4729669::createTestUI) + .positionTestUIRightColumn() + .logArea() + .build() + .awaitAndCheck(); + } + + private static List createTestUI() { + JFrame f1 = MenuItemTestHelper.getMenuItemTestFrame(true); + JFrame f2 = MenuItemTestHelper.getMenuItemTestFrame(false); + return List.of(f1, f2); + } +} + diff --git a/test/jdk/javax/swing/JMenuItem/bug6197830.java b/test/jdk/javax/swing/JMenuItem/MenuItemTest/bug6197830.java similarity index 56% rename from test/jdk/javax/swing/JMenuItem/bug6197830.java rename to test/jdk/javax/swing/JMenuItem/MenuItemTest/bug6197830.java index 58fd9a76e23c9..afb1c7bb33f95 100644 --- a/test/jdk/javax/swing/JMenuItem/bug6197830.java +++ b/test/jdk/javax/swing/JMenuItem/MenuItemTest/bug6197830.java @@ -31,13 +31,16 @@ * @run main/manual bug6197830 */ +import java.util.List; +import javax.swing.JFrame; + public class bug6197830 { private static final String INSTRUCTIONS = """ - Four windows should appear: Left-to-right and Right-to-left for - the two different Look and Feels (Motif and GTK). - Check that text on all the menu items of all menus is properly - vertically aligned."""; + Four windows should appear: Left-to-right and Right-to-left for + the two different Look and Feels (Motif and GTK). + Check that text on all the menu items of all menus is properly + vertically aligned."""; public static void main(String[] args) throws Exception { PassFailJFrame.builder() @@ -45,30 +48,20 @@ public static void main(String[] args) throws Exception { .instructions(INSTRUCTIONS) .columns(35) .testUI(bug6197830::createTestUI) - .position(PassFailJFrame.Position.TOP_LEFT_CORNER) + .positionTestUIBottomRowCentered() .build() .awaitAndCheck(); } private static List createTestUI() { - JFrame frame1 = MenuItemTest.doMenuItemTest(true, - "com.sun.java.swing.plaf.motif.MotifLookAndFeel", - 20); - frame1.setLocation(300, 300); - JFrame frame2 = MenuItemTest.doMenuItemTest(false, - "com.sun.java.swing.plaf.motif.MotifLookAndFeel", - 20); - frame2.setLocation((int)(frame1.getLocation().getX() + frame1.getWidth() - + 100), 300); - JFrame frame3 = MenuItemTest.doMenuItemTest(true, - "com.sun.java.swing.plaf.gtk.GTKLookAndFeel", 420); - frame3.setLocation(300, (int)(frame1.getLocation().getY() - + frame1.getHeight() + 100)); - JFrame frame4 = MenuItemTest.doMenuItemTest(false, - "com.sun.java.swing.plaf.gtk.GTKLookAndFeel", 420); - frame4.setLocation((int)(frame3.getLocation().getX() + frame3.getWidth() - + 100), - (int)frame3.getLocation().getY()); + JFrame frame1 = MenuItemTestHelper.getMenuItemTestFrame(true, + "com.sun.java.swing.plaf.motif.MotifLookAndFeel"); + JFrame frame2 = MenuItemTestHelper.getMenuItemTestFrame(false, + "com.sun.java.swing.plaf.motif.MotifLookAndFeel"); + JFrame frame3 = MenuItemTestHelper.getMenuItemTestFrame(true, + "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); + JFrame frame4 = MenuItemTestHelper.getMenuItemTestFrame(false, + "com.sun.java.swing.plaf.gtk.GTKLookAndFeel"); return List.of(frame1, frame2, frame3, frame4); } } diff --git a/test/jdk/javax/swing/JMenuItem/bug4729669.java b/test/jdk/javax/swing/JMenuItem/bug4729669.java deleted file mode 100644 index 815558fc8fdc6..0000000000000 --- a/test/jdk/javax/swing/JMenuItem/bug4729669.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (c) 2005, 2025, 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 4729669 - * @summary 1.4 REGRESSION: Text edge of different types of JMenuItems are not aligned - * @library /java/awt/regtesthelpers - * @build PassFailJFrame - * @run main/manual bug4729669 - */ - -import java.awt.Color; -import java.awt.ComponentOrientation; -import java.awt.Component; -import java.awt.Graphics; -import java.awt.event.ActionEvent; -import java.awt.event.KeyEvent; - -import javax.swing.AbstractAction; -import javax.swing.Icon; -import javax.swing.JCheckBoxMenuItem; -import javax.swing.JFrame; -import javax.swing.JMenu; -import javax.swing.JMenuBar; -import javax.swing.JMenuItem; -import javax.swing.JRadioButtonMenuItem; -import javax.swing.KeyStroke; - -import java.util.List; - -public class bug4729669 { - - private static final String INSTRUCTIONS = """ - Two windows should appear: Left-to-right and Right-to-left. - Check that text on all the menu items of all menus - is properly vertically aligned."""; - - public static void main(String[] args) throws Exception { - PassFailJFrame.builder() - .title("bug4729669 Instructions") - .instructions(INSTRUCTIONS) - .columns(35) - .testUI(bug4729669::createTestUI) - .position(PassFailJFrame.Position.TOP_LEFT_CORNER) - .logArea() - .build() - .awaitAndCheck(); - } - - private static List createTestUI() { - JFrame f1 = MenuItemTest.doMenuItemTest(true); - f1.setLocation(300, 300); - JFrame f2 = MenuItemTest.doMenuItemTest(false); - f2.setLocation(500, 300); - return List.of(f1, f2); - } -} - -class MenuItemTest { - public static JFrame doMenuItemTest(boolean isLeft) { - JMenu menu = new JMenu("View"); - menu.setMnemonic('V'); - - menu.add(new JMenuItem("Refresh")); - menu.add(new JMenuItem("Customize...")); - menu.add(new JCheckBoxMenuItem("Show Toolbar")); - menu.addSeparator(); - menu.add(new JRadioButtonMenuItem("List")); - menu.add(new JRadioButtonMenuItem("Icons")); - JRadioButtonMenuItem rm2 = new JRadioButtonMenuItem("And icon."); - rm2.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F1, - KeyEvent.SHIFT_MASK)); - menu.add(rm2); - JRadioButtonMenuItem mi3 = new JRadioButtonMenuItem("Radio w/icon"); - - Icon myIcon = new Icon() { // 10 pixel red - public void paintIcon(Component c, Graphics g, int x, int y) { - Color color = g.getColor(); - g.setColor(Color.RED); - g.fillRect(x, y, 10, 10); - g.setColor(color); - } - - public int getIconWidth() { - return 10; - } - - public int getIconHeight() { - return 10; - } - }; - - Icon myIcon2 = new Icon() { // 15 pixel green - public void paintIcon(Component c, Graphics g, int x, int y) { - Color color = g.getColor(); - g.setColor(Color.GREEN); - g.fillRect(x, y, 15, 10); - g.setColor(color); - } - - public int getIconWidth() { - return 15; - } - - public int getIconHeight() { - return 10; - } - }; - - rm2.setIcon(myIcon2); - - mi3.setIcon(myIcon); - menu.add(mi3); - menu.add(new JMenuItem(myIcon2)); - - final JMenu menu2 = new JMenu("No nothing"); - menu2.add("One").addActionListener(new AbstractAction() { - public void actionPerformed(ActionEvent e) { - PassFailJFrame.log("menu.width = " + menu2.getPopupMenu().getWidth()); - } - }); - menu2.add("Two").addActionListener(new AbstractAction() { - public void actionPerformed(ActionEvent e) { - PassFailJFrame.log("menu.width = " + menu2.getPopupMenu().getWidth()); - } - }); - menu2.add("Threeee").addActionListener(new AbstractAction() { - public void actionPerformed(ActionEvent e) { - PassFailJFrame.log("menu.width = " + menu2.getPopupMenu().getWidth()); - } - }); - - JMenuItem mi4 = new JMenuItem("Item with icon"); - mi4.setIcon(myIcon); - menu.addSeparator(); - menu.add(mi4); - String title = "Menu Item Test " + (isLeft ? "(Left-to-right)" : "(Right-to-left)"); - JFrame frame = new JFrame(title); - - JMenuBar menuBar = new JMenuBar(); - menuBar.add(menu); - menuBar.add(menu2); - - JMenu someIcons = new JMenu("Some icons"); - JMenuItem imi1 = new JMenuItem("Icon!"); - imi1.setIcon(myIcon); - someIcons.add(imi1); - JMenuItem imi2 = new JMenuItem("Wide icon!"); - imi2.setIcon(myIcon2); - someIcons.add(imi2); - someIcons.add(new JCheckBoxMenuItem("CheckBox")); - someIcons.add(new JRadioButtonMenuItem("RadioButton")); - menuBar.add(someIcons); - frame.setJMenuBar(menuBar); - ComponentOrientation co = (isLeft ? - ComponentOrientation.LEFT_TO_RIGHT : - ComponentOrientation.RIGHT_TO_LEFT); - frame.applyComponentOrientation(co); - frame.setSize(300, 300); - int frameX = isLeft ? 0 : 600; - frame.setLocation(frameX, 20); - return frame; - } - -}