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 }