1 /* 2 * Copyright (c) 2006, 2014, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 import javax.swing.*; 25 import java.awt.*; 26 import java.awt.event.InputEvent; 27 import static jdk.testlibrary.Asserts.assertTrue; 28 29 /* 30 * @test 31 * @summary Have different components having different preferred sizes 32 * added to a grid layout. Change the rows and columns of the 33 * grid layout and check the components are re-laid out. 34 * The strategy followed is to calculate the component location 35 * depending on the preferred sizes and gaps and click the cornors 36 * of the components to check if events are triggered 37 * @library ../../../../lib/testlibrary/ 38 * @build ExtendedRobot jdk.testlibrary.Asserts 39 * @run main ChangeGridSize 40 * @run main ChangeGridSize -hg 20 -vg 20 41 */ 42 43 public class ChangeGridSize { 44 45 private int hGap, vGap; 46 private int width = 200; 47 private int height = 200; 48 private int rows = 3; 49 private int columns = 2; 50 private int componentCount = 6; 51 52 private JButton[] buttons; 53 private JFrame frame; 54 55 private ExtendedRobot robot; 56 private GridLayout layout; 57 58 private boolean actionPerformed = false; 59 60 public ChangeGridSize(int hGap, int vGap) throws Exception { 61 this.hGap = hGap; 62 this.vGap = vGap; 63 robot = new ExtendedRobot(); 64 SwingUtilities.invokeAndWait( () -> { 65 frame = new JFrame("Test frame"); 66 frame.setSize(width, height); 67 layout = new GridLayout(rows + 3, columns - 1, hGap, vGap); 68 frame.getContentPane().setLayout(layout); 69 70 buttons = new JButton[componentCount]; 71 for (int i = 0; i < componentCount; i++) { 72 buttons[i] = new JButton("Button" + i); 73 frame.getContentPane().add(buttons[i]); 74 buttons[i].addActionListener( (event) -> { actionPerformed = true; }); 75 } 76 77 frame.setVisible(true); 78 }); 79 } 80 81 public static void main(String[] args) throws Exception { 82 int hGap = 0; 83 int vGap = 0; 84 for (int i = 0; i < args.length; i++) { 85 switch (args[i]) { 86 case "-hg": 87 hGap = Integer.parseInt(args[++i]); 88 break; 89 case "-vg": 90 vGap = Integer.parseInt(args[++i]); 91 break; 92 } 93 } 94 new ChangeGridSize(hGap, vGap).doTest(); 95 } 96 97 private void resizeFrame() throws Exception { 98 SwingUtilities.invokeAndWait( () -> { 99 double dH = (frame.getContentPane().getSize().getHeight() - vGap*(rows-1)) % rows; 100 height -= dH; 101 frame.setSize(width, height); 102 frame.getContentPane().revalidate(); 103 }); 104 robot.waitForIdle(); 105 } 106 107 private void changeGridSize() throws Exception { 108 SwingUtilities.invokeAndWait(() -> { 109 layout.setRows(rows); 110 layout.setColumns(columns); 111 112 frame.getContentPane().revalidate(); 113 }); 114 robot.waitForIdle(); 115 } 116 117 public void testBoundaries(int topLeftX, int topLeftY, int bottomRightX, int bottomRightY) throws Exception { 118 119 actionPerformed = false; 120 robot.mouseMove(topLeftX, topLeftY); 121 robot.delay(500); 122 robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); 123 robot.delay(500); 124 robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); 125 robot.delay(3000); 126 robot.waitForIdle(); 127 128 assertTrue(actionPerformed, "Clicking on the left top of button did not trigger action event"); 129 130 actionPerformed = false; 131 robot.mouseMove(bottomRightX, bottomRightY); 132 robot.delay(500); 133 robot.mousePress(InputEvent.BUTTON1_DOWN_MASK); 134 robot.delay(500); 135 robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK); 136 robot.delay(3000); 137 robot.waitForIdle(); 138 139 assertTrue(actionPerformed, "Clicking on the bottom right of button did not trigger action event"); 140 } 141 142 private void doTest() throws Exception { 143 robot.waitForIdle(); 144 changeGridSize(); 145 resizeFrame(); 146 147 int availableWidth = width - frame.getInsets().left - 148 frame.getInsets().right; 149 int componentWidth = (availableWidth + hGap) / columns - hGap; 150 int availableHeight = height - frame.getInsets().top - 151 frame.getInsets().bottom; 152 int componentHeight = (availableHeight + vGap) / rows - vGap; 153 154 for (int i = 0; i < buttons.length; i++) { 155 if (buttons[i].getSize().width != componentWidth || 156 buttons[i].getSize().height != componentHeight) { 157 throw new RuntimeException( 158 "FAIL: Button " + i + " not of proper size" + 159 "Expected: " + componentWidth + "*" + componentHeight + 160 "Actual: " + buttons[i].getSize().width + "*" + buttons[i].getSize().height); 161 } 162 } 163 164 // Components are visible. They should trigger events. 165 // Now you can check for the actual size shown. 166 int currentRow = 1; 167 int currentColumn = 0; 168 for (int i = 0; i < buttons.length; i++) { 169 currentColumn++; 170 if (currentColumn > columns) { 171 currentColumn = 1; 172 currentRow++; 173 } 174 175 int topPosX = frame.getLocationOnScreen().x + 176 frame.getInsets().left + 177 (currentColumn - 1) * (componentWidth + hGap); 178 int topPosY = frame.getLocationOnScreen().y + 179 frame.getInsets().top + 180 (currentRow - 1) * (componentHeight + vGap); 181 182 int bottomPosX = topPosX + componentWidth - 1; 183 int bottomPosY = topPosY + componentHeight - 1; 184 testBoundaries(topPosX, topPosY, bottomPosX, bottomPosY); 185 } 186 } 187 }