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