1 /* 2 * Copyright (c) 2015, 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 /* 25 * @test 26 * @key headful 27 * @bug 8077409 28 * @summary Drawing deviates when validate() is invoked on java.awt.ScrollPane 29 * @author mikhail.cherkasov@oracle.com 30 * @run main bug8077409Test 31 */ 32 33 34 import java.awt.*; 35 import java.awt.event.*; 36 37 public class bug8077409Test extends Frame { 38 ScrollPane pane; 39 MyCanvas myCanvas; 40 41 class MyCanvas extends Canvas { 42 public Dimension getPreferredSize() { 43 return new Dimension(400, 800); 44 } 45 46 public void paint(Graphics g) { 47 g.setColor(Color.BLACK); 48 g.drawLine(0, 0, 399, 0); 49 g.setColor(Color.RED); 50 g.drawLine(0, 1, 399, 1); 51 g.setColor(Color.BLUE); 52 g.drawLine(0, 2, 399, 2); 53 g.setColor(Color.GREEN); 54 g.drawLine(0, 3, 399, 3); 55 } 56 57 } 58 59 public bug8077409Test() { 60 super(); 61 setLayout(new BorderLayout()); 62 pane = new ScrollPane(); 63 64 myCanvas = new MyCanvas(); 65 pane.add(myCanvas); 66 67 add(pane, BorderLayout.CENTER); 68 setSize(320, 480); 69 70 } 71 72 @Override 73 protected void processKeyEvent(KeyEvent e) { 74 super.processKeyEvent(e); 75 76 } 77 78 public static void main(String[] args) throws AWTException, InterruptedException { 79 final bug8077409Test obj = new bug8077409Test(); 80 obj.setVisible(true); 81 Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 82 @Override 83 public void eventDispatched(AWTEvent e) { 84 KeyEvent keyEvent = (KeyEvent) e; 85 if(keyEvent.getID() == KeyEvent.KEY_RELEASED) { 86 if (keyEvent.getKeyCode() == KeyEvent.VK_1) { 87 System.out.println(obj.pane.toString()); 88 System.out.println("obj.myCanvas.pos: " + obj.myCanvas.getBounds()); 89 System.out.println(obj.myCanvas.toString()); 90 } else if (keyEvent.getKeyCode() == KeyEvent.VK_2) { 91 obj.repaint(); 92 } else if (keyEvent.getKeyCode() == KeyEvent.VK_DOWN) { 93 Point scrollPosition = obj.pane.getScrollPosition(); 94 scrollPosition.translate(0, 1); 95 obj.pane.setScrollPosition(scrollPosition); 96 } else if (keyEvent.getKeyCode() == KeyEvent.VK_UP) { 97 Point scrollPosition = obj.pane.getScrollPosition(); 98 scrollPosition.translate(0, -1); 99 obj.pane.setScrollPosition(scrollPosition); 100 } else if (keyEvent.getKeyCode() == KeyEvent.VK_SPACE) { 101 obj.pane.validate(); 102 } 103 } 104 } 105 }, AWTEvent.KEY_EVENT_MASK); 106 Point scrollPosition = obj.pane.getScrollPosition(); 107 scrollPosition.translate(0, 1); 108 obj.pane.setScrollPosition(scrollPosition); 109 110 int y = obj.pane.getComponent(0).getLocation().y; 111 obj.pane.validate(); 112 if(y != obj.pane.getComponent(0).getLocation().y){ 113 throw new RuntimeException("Wrong position of component in ScrollPane"); 114 } 115 } 116 117 }