jdk-24/test/jdk/java/awt/Focus/InitialFocusTest.java
2023-04-28 18:46:48 +00:00

145 lines
5.4 KiB
Java

/*
* Copyright (c) 2002, 2023, 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 4150021
@summary if user requests focus on some component, it must become a focus owner after activation
@key headful
@run main InitialFocusTest
*/
import java.awt.AWTException;
import java.awt.Button;
import java.awt.DefaultKeyboardFocusManager;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import java.awt.Frame;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.lang.reflect.InvocationTargetException;
import java.util.concurrent.atomic.AtomicBoolean;
public class InitialFocusTest implements PropertyChangeListener {
//Declare things used in the test, like buttons and labels here
final static String FOCUSED_WINDOW_PROP = "focusedWindow";
final static int ACTION_TIMEOUT = 2000;
volatile Frame frame;
volatile Button btn1;
volatile Button btn2;
public void start() throws InterruptedException, InvocationTargetException {
DefaultKeyboardFocusManager.getCurrentKeyboardFocusManager().
addPropertyChangeListener(FOCUSED_WINDOW_PROP, this);
try {
EventQueue.invokeAndWait(() -> {
frame = new Frame("InitialFocusTest");
frame.setLayout(new FlowLayout());
btn1 = new Button("First Button");
frame.add(btn1);
btn2 = new Button("Second Button");
frame.add(btn2);
frame.setLocationRelativeTo(null);
frame.pack();
frame.setVisible(true);
});
try {
Robot robot = new Robot();
robot.delay(ACTION_TIMEOUT);
if (!activateFrame(frame, robot, ACTION_TIMEOUT)) {
throw new RuntimeException("Frame was not activated.");
}
robot.delay(ACTION_TIMEOUT);
AtomicBoolean isFocused = new AtomicBoolean(false);
EventQueue.invokeAndWait(() -> {
isFocused.set(frame.isFocused());
});
if (!isFocused.get()) {
throw new RuntimeException("Frame didn't become focused.");
}
EventQueue.invokeAndWait(() -> {
isFocused.set(btn2.isFocusOwner());
});
if (!isFocused.get()) {
throw new RuntimeException("Btn2 didn't receive focus.");
}
} catch (AWTException e) {
e.printStackTrace();
}
System.out.printf("Test passed.");
} finally {
if (frame != null) {
EventQueue.invokeAndWait(frame::dispose);
}
}
}
public void propertyChange(PropertyChangeEvent pce) {
if (FOCUSED_WINDOW_PROP.equals(pce.getPropertyName())) {
if (pce.getNewValue() == frame) {
System.out.println("requesting focus on btn2");
btn2.requestFocusInWindow();
}
}
}
boolean activateFrame(Frame frame, Robot robot, int timeout)
throws InterruptedException, InvocationTargetException {
AtomicBoolean isActive = new AtomicBoolean(false);
EventQueue.invokeAndWait(() -> {
isActive.set(frame.isActive());
});
if (!isActive.get()) {
int[] point = new int[2];
EventQueue.invokeAndWait(() -> {
Point origin = frame.getLocationOnScreen();
Dimension dim = frame.getSize();
Insets insets = frame.getInsets();
point[0] = origin.x + dim.width / 2;
point[1] = origin.y + insets.top / 2;
});
robot.mouseMove(point[0], point[1]);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);
robot.waitForIdle();
robot.delay(timeout);
EventQueue.invokeAndWait(() -> {
isActive.set(frame.isActive());
});
}
return frame.isActive();
}
public static void main(String[] args) throws InterruptedException,
InvocationTargetException {
InitialFocusTest test = new InitialFocusTest();
test.start();
}
}