diff --git a/test/jdk/javax/swing/JButton/bug4323121.java b/test/jdk/javax/swing/JButton/bug4323121.java index 0b352ce57eb..f23cfe43f6a 100644 --- a/test/jdk/javax/swing/JButton/bug4323121.java +++ b/test/jdk/javax/swing/JButton/bug4323121.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2000, 2024, 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 @@ -24,59 +24,81 @@ /* * @test * @bug 4323121 - * @summary Tests whether any button that extends JButton always - returns true for isArmed() + * @summary Tests whether a button model always returns true for isArmed() + * when mouse hovers over the button * @key headful * @run main bug4323121 */ -import java.awt.Graphics; import java.awt.Point; import java.awt.Robot; +import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseListener; -import java.awt.event.MouseMotionListener; +import java.util.concurrent.CountDownLatch; + import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.SwingUtilities; -public class bug4323121 { +import static java.util.concurrent.TimeUnit.SECONDS; + +public final class bug4323121 { static JFrame frame; - static testButton button; - static volatile Point pt; - static volatile int buttonW; - static volatile int buttonH; - static volatile boolean failed = false; + static JButton button; + + static volatile Point buttonCenter; + + private static final CountDownLatch mouseEntered = new CountDownLatch(1); + + // Usage of this flag is thread-safe because of using the mouseEntered latch + private static boolean modelArmed; public static void main(String[] args) throws Exception { Robot robot = new Robot(); robot.setAutoDelay(100); + try { SwingUtilities.invokeAndWait(() -> { + button = new JButton("gotcha"); + button.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + if (button.getModel().isArmed()) { + modelArmed = true; + } + mouseEntered.countDown(); + } + }); + frame = new JFrame("bug4323121"); - button = new testButton("gotcha"); frame.getContentPane().add(button); + frame.pack(); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); + robot.waitForIdle(); - robot.delay(1000); + SwingUtilities.invokeAndWait(() -> { - pt = button.getLocationOnScreen(); - buttonW = button.getSize().width; - buttonH = button.getSize().height; + Point location = button.getLocationOnScreen(); + buttonCenter = new Point(location.x + button.getWidth() / 2, + location.y + button.getHeight() / 2); }); - robot.mouseMove(pt.x + buttonW / 2, pt.y + buttonH / 2); - robot.waitForIdle(); - if (failed) { - throw new RuntimeException("Any created button returns " + - "true for isArmed()"); + + robot.mouseMove(buttonCenter.x, buttonCenter.y); + + if (!mouseEntered.await(1, SECONDS)) { + throw new RuntimeException("Mouse entered event wasn't received"); + } + if (modelArmed) { + throw new RuntimeException("getModel().isArmed() returns true " + + "when mouse hovers over the button"); } } finally { - SwingUtilities.invokeAndWait(() -> { + SwingUtilities.invokeAndWait(() -> { if (frame != null) { frame.dispose(); } @@ -84,42 +106,4 @@ public class bug4323121 { } } - static class testButton extends JButton implements MouseMotionListener, MouseListener { - public testButton(String label) { - super(label); - addMouseMotionListener(this); - addMouseListener(this); - } - - protected void paintComponent(Graphics g) { - super.paintComponent(g); - } - - protected void paintBorder(Graphics g) { - } - - public void mousePressed(MouseEvent e) { - } - - public void mouseDragged(MouseEvent e) { - } - - public void mouseMoved(MouseEvent e) { - } - - public void mouseReleased(MouseEvent e) { - } - - public void mouseEntered(MouseEvent e) { - if (getModel().isArmed()) { - failed = true; - } - } - - public void mouseExited(MouseEvent e) { - } - - public void mouseClicked(MouseEvent e) { - } - } }