bug8077409Test.java revision 12677:a4299d47bd00
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
32import java.awt.*;
33import java.awt.event.*;
34
35public 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}
116