# HG changeset patch # User malenkov # Date 1274373776 -14400 # Node ID bbd5a5a4e64fe6a5d7ec83815320a8432df978fa # Parent a71c27e3ec4aee5a61b8e324373097dd736cc0b3 6910490: MatteBorder JScrollpane interaction Reviewed-by: alexp diff -r a71c27e3ec4a -r bbd5a5a4e64f src/share/classes/javax/swing/border/MatteBorder.java --- a/src/share/classes/javax/swing/border/MatteBorder.java Thu May 20 18:44:51 2010 +0400 +++ b/src/share/classes/javax/swing/border/MatteBorder.java Thu May 20 20:42:56 2010 +0400 @@ -1,5 +1,5 @@ /* - * Copyright 1997-2006 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -26,7 +26,6 @@ import java.awt.Graphics; import java.awt.Insets; -import java.awt.Rectangle; import java.awt.Component; import java.awt.Color; @@ -133,63 +132,29 @@ g.fillRect(width - insets.right, 0, insets.right, height - insets.bottom); } else if (tileIcon != null) { - int tileW = tileIcon.getIconWidth(); int tileH = tileIcon.getIconHeight(); - int xpos, ypos, startx, starty; - Graphics cg; - - // Paint top matte edge - cg = g.create(); - cg.setClip(0, 0, width, insets.top); - for (ypos = 0; insets.top - ypos > 0; ypos += tileH) { - for (xpos = 0; width - xpos > 0; xpos += tileW) { - tileIcon.paintIcon(c, cg, xpos, ypos); - } - } - cg.dispose(); - - // Paint left matte edge - cg = g.create(); - cg.setClip(0, insets.top, insets.left, height - insets.top); - starty = insets.top - (insets.top%tileH); - startx = 0; - for (ypos = starty; height - ypos > 0; ypos += tileH) { - for (xpos = startx; insets.left - xpos > 0; xpos += tileW) { - tileIcon.paintIcon(c, cg, xpos, ypos); - } - } - cg.dispose(); - - // Paint bottom matte edge - cg = g.create(); - cg.setClip(insets.left, height - insets.bottom, width - insets.left, insets.bottom); - starty = (height - insets.bottom) - ((height - insets.bottom)%tileH); - startx = insets.left - (insets.left%tileW); - for (ypos = starty; height - ypos > 0; ypos += tileH) { - for (xpos = startx; width - xpos > 0; xpos += tileW) { - tileIcon.paintIcon(c, cg, xpos, ypos); - } - } - cg.dispose(); - - // Paint right matte edge - cg = g.create(); - cg.setClip(width - insets.right, insets.top, insets.right, height - insets.top - insets.bottom); - starty = insets.top - (insets.top%tileH); - startx = width - insets.right - ((width - insets.right)%tileW); - for (ypos = starty; height - ypos > 0; ypos += tileH) { - for (xpos = startx; width - xpos > 0; xpos += tileW) { - tileIcon.paintIcon(c, cg, xpos, ypos); - } - } - cg.dispose(); + paintEdge(c, g, 0, 0, width - insets.right, insets.top, tileW, tileH); + paintEdge(c, g, 0, insets.top, insets.left, height - insets.top, tileW, tileH); + paintEdge(c, g, insets.left, height - insets.bottom, width - insets.left, insets.bottom, tileW, tileH); + paintEdge(c, g, width - insets.right, 0, insets.right, height - insets.bottom, tileW, tileH); } g.translate(-x, -y); g.setColor(oldColor); } + private void paintEdge(Component c, Graphics g, int x, int y, int width, int height, int tileW, int tileH) { + g = g.create(x, y, width, height); + int sY = -(y % tileH); + for (x = -(x % tileW); x < width; x += tileW) { + for (y = sY; y < height; y += tileH) { + this.tileIcon.paintIcon(c, g, x, y); + } + } + g.dispose(); + } + /** * Reinitialize the insets parameter with this Border's current Insets. * @param c the component for which this border insets value applies diff -r a71c27e3ec4a -r bbd5a5a4e64f test/javax/swing/border/Test6910490.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/border/Test6910490.html Thu May 20 20:42:56 2010 +0400 @@ -0,0 +1,9 @@ + + +If the border is painted over scroll bars then test fails. +Otherwise test passes. + + + + + diff -r a71c27e3ec4a -r bbd5a5a4e64f test/javax/swing/border/Test6910490.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/javax/swing/border/Test6910490.java Thu May 20 20:42:56 2010 +0400 @@ -0,0 +1,77 @@ +/* + * Copyright 2010 Sun Microsystems, Inc. All Rights Reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, + * CA 95054 USA or visit www.sun.com if you need additional information or + * have any questions. + */ + +import static java.awt.Color.RED; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.Graphics; +import java.awt.Insets; +import javax.swing.Icon; +import javax.swing.JApplet; +import javax.swing.JButton; +import javax.swing.JScrollPane; +import javax.swing.JSplitPane; +import javax.swing.border.MatteBorder; + +/* + * @test + * @bug 6910490 + * @summary Tests a matte border around a component inside a scroll pane. + * @author Sergey Malenkov + * @run applet/manual=yesno Test6910490.html + */ + +public class Test6910490 extends JApplet implements Icon { + + @Override + public void init() { + Insets insets = new Insets(10, 10, 10, 10); + Dimension size = new Dimension(getWidth() / 2, getHeight()); + JSplitPane pane = new JSplitPane( + JSplitPane.HORIZONTAL_SPLIT, + create("Color", size, new MatteBorder(insets, RED)), + create("Icon", size, new MatteBorder(insets, this))); + pane.setDividerLocation(size.width - pane.getDividerSize() / 2); + add(pane); + } + + private JScrollPane create(String name, Dimension size, MatteBorder border) { + JButton button = new JButton(name); + button.setPreferredSize(size); + button.setBorder(border); + return new JScrollPane(button); + } + + public int getIconWidth() { + return 10; + } + + public int getIconHeight() { + return 10; + } + + public void paintIcon(Component c, Graphics g, int x, int y) { + g.setColor(RED); + g.fillRect(x, y, getIconWidth(), getIconHeight()); + } +}