--- a/jdk/test/javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java Tue May 31 12:29:57 2016 +0530
+++ b/jdk/test/javax/swing/plaf/basic/BasicComboPopup/7072653/bug7072653.java Tue May 31 16:03:21 2016 +0530
@@ -22,106 +22,153 @@
*/
/* @test
- @bug 7072653
- @summary JComboBox popup mispositioned if its height exceeds the screen height
- @author Semyon Sadetsky
- */
-
-
-import javax.swing.*;
+ * @bug 7072653 8144161
+ * @summary JComboBox popup mispositioned if its height exceeds the screen height
+ * @run main bug7072653
+ */
+import java.awt.FlowLayout;
+import java.awt.GraphicsConfiguration;
+import java.awt.Insets;
+import java.awt.Robot;
import javax.swing.event.PopupMenuEvent;
import javax.swing.event.PopupMenuListener;
-import java.awt.*;
import java.awt.Toolkit;
+import java.awt.Window;
+import java.util.Arrays;
+import javax.swing.DefaultComboBoxModel;
+import javax.swing.JComboBox;
+import javax.swing.JFrame;
+import javax.swing.SwingUtilities;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
public class bug7072653 {
private static JComboBox combobox;
private static JFrame frame;
+ private static Robot robot;
+ private static volatile String errorString = "";
public static void main(String[] args) throws Exception {
- try {
+ robot = new Robot();
+ robot.delay(100);
+ UIManager.LookAndFeelInfo[] lookAndFeelArray
+ = UIManager.getInstalledLookAndFeels();
+ for (UIManager.LookAndFeelInfo lookAndFeelItem : lookAndFeelArray) {
+ executeCase(lookAndFeelItem.getClassName());
+ robot.delay(1000);
+ }
+ if (!"".equals(errorString)) {
+
+ throw new RuntimeException("Error Log:\n" + errorString);
+ }
+ }
+
+ private static void executeCase(String lookAndFeelString) throws Exception {
+ if (tryLookAndFeel(lookAndFeelString)) {
SwingUtilities.invokeAndWait(new Runnable() {
@Override
public void run() {
- frame = new JFrame("JComboBox Test");
- setup(frame);
+ try {
+ setup(lookAndFeelString);
+ test();
+ } catch (Exception ex) {
+ errorString += "\n";
+ errorString += Arrays.toString(ex.getStackTrace());
+ }
+ finally {
+ frame.dispose();
+ }
}
});
- test();
- }
- finally {
- frame.dispose();
}
}
- static void setup(JFrame frame) {
-
+ private static void setup(String lookAndFeelString)
+ throws Exception {
- frame.setUndecorated(true);
+ frame = new JFrame("JComboBox Test " + lookAndFeelString);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
-
frame.setSize(320, 200);
-
frame.getContentPane().setLayout(new FlowLayout());
-
+ frame.setLocationRelativeTo(null);
combobox = new JComboBox(new DefaultComboBoxModel() {
- public Object getElementAt(int index) { return "Element " + index; }
+ @Override
+ public Object getElementAt(int index) {
+ return "Element " + index;
+ }
+
+ @Override
public int getSize() {
- return 1000;
+ return 100;
}
});
-
combobox.setMaximumRowCount(100);
frame.getContentPane().add(combobox);
+ frame.setVisible(true);
+ combobox.addPopupMenuListener(new PopupMenuListener() {
+ @Override
+ public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
+ }
- frame.setVisible(true);
+ @Override
+ public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
+ int height = 0;
+ for (Window window : JFrame.getWindows()) {
+ if (Window.Type.POPUP == window.getType()) {
+ height = window.getSize().height;
+ break;
+ }
+ }
+ GraphicsConfiguration gc
+ = combobox.getGraphicsConfiguration();
+ Insets screenInsets = Toolkit.getDefaultToolkit()
+ .getScreenInsets(gc);
+ int gcHeight = gc.getBounds().height;
+ if (lookAndFeelString.contains("aqua")) {
+ gcHeight = gcHeight - screenInsets.top;
+ //For Aqua LAF
+ } else {
+ gcHeight = gcHeight - screenInsets.top
+ - screenInsets.bottom;
+ }
+ if (height == gcHeight) {
+ return;
+ }
+
+ String exception = "Popup window height "
+ + "For LookAndFeel" + lookAndFeelString + " is wrong"
+ + "\nShould be " + height + "Actually " + gcHeight;
+ errorString += exception;
+ }
+
+ @Override
+ public void popupMenuCanceled(PopupMenuEvent e) {
+ }
+
+ });
}
- static void test() throws Exception{
- SwingUtilities.invokeAndWait(new Runnable() {
- @Override
- public void run() {
- combobox.addPopupMenuListener(new PopupMenuListener() {
- @Override
- public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
- }
-
- @Override
- public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
- int height = 0;
- for (Window window : JFrame.getWindows()) {
- if (Window.Type.POPUP == window.getType()) {
- height = window.getSize().height;
- break;
- }
- }
- GraphicsConfiguration gc =
- combobox.getGraphicsConfiguration();
- Insets screenInsets = Toolkit.getDefaultToolkit()
- .getScreenInsets(gc);
-
- if (height == gc.getBounds().height - screenInsets.top -
- screenInsets.bottom ) {
- System.out.println("ok");
- return;
- }
- throw new RuntimeException(
- "Popup window height is wrong " + height);
- }
-
- @Override
- public void popupMenuCanceled(PopupMenuEvent e) {
- }
- });
- combobox.setPopupVisible(true);
- combobox.setPopupVisible(false);
- }
- });
+ private static void test() throws Exception {
+ combobox.setPopupVisible(true);
+ combobox.setPopupVisible(false);
}
+ private static boolean tryLookAndFeel(String lookAndFeelString)
+ throws Exception {
+ try {
+ UIManager.setLookAndFeel(
+ lookAndFeelString);
+ } catch (UnsupportedLookAndFeelException
+ | ClassNotFoundException
+ | InstantiationException
+ | IllegalAccessException e) {
+ return false;
+ }
+ return true;
+ }
}