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 }