/* * * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * - Neither the name of Oracle nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package java2d; import static java.awt.Color.GRAY; import static java.awt.Color.GREEN; import static java.awt.Color.LIGHT_GRAY; import static java.awt.Color.WHITE; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.Frame; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridLayout; import java.awt.Image; import java.awt.Rectangle; import java.awt.TexturePaint; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.Ellipse2D; import java.awt.image.BufferedImage; import javax.swing.JPanel; import javax.swing.border.EtchedBorder; import javax.swing.border.TitledBorder; /** * Four types of Paint displayed: Geometry, Text & Image Textures and * a Gradient Paint. Paints can be selected with the Mouse. */ @SuppressWarnings("serial") public final class TextureChooser extends JPanel { private final DemoInstVarsAccessor demoInstVars; public Object texture = getGeomTexture(); public int num; public TextureChooser(int num, DemoInstVarsAccessor demoInstVars) { this.num = num; this.demoInstVars = demoInstVars; setLayout(new GridLayout(0, 2, 5, 5)); setBorder(new TitledBorder(new EtchedBorder(), "Texture Chooser")); add(new Surface(getGeomTexture(), this, 0)); add(new Surface(getImageTexture(), this, 1)); add(new Surface(getTextTexture(), this, 2)); add(new Surface(getGradientPaint(), this, 3)); } public static TexturePaint getGeomTexture() { BufferedImage bi = new BufferedImage(5, 5, BufferedImage.TYPE_INT_RGB); Graphics2D tG2 = bi.createGraphics(); tG2.setBackground(WHITE); tG2.clearRect(0, 0, 5, 5); tG2.setColor(new Color(211, 211, 211, 200)); tG2.fill(new Ellipse2D.Float(0, 0, 5, 5)); Rectangle r = new Rectangle(0, 0, 5, 5); return new TexturePaint(bi, r); } public TexturePaint getImageTexture() { Image img = DemoImages.getImage("globe.png", this); int sw = img.getWidth(this); int sh = img.getHeight(this); int iw = sw/5; int ih = sh/5; BufferedImage bi = new BufferedImage(iw, ih, BufferedImage.TYPE_INT_ARGB); Graphics2D tG2 = bi.createGraphics(); tG2.drawImage(img, 0, 0, iw, ih, 0, 0, sw, sh, this); Rectangle r = new Rectangle(0, 0, iw, ih); return new TexturePaint(bi, r); } public TexturePaint getTextTexture() { Font f = new Font(Font.SERIF, Font.BOLD, 10); TextLayout tl = new TextLayout("OpenJDK", f, new FontRenderContext(null, false, false)); int sw = (int) tl.getBounds().getWidth(); int sh = (int) (tl.getAscent() + tl.getDescent()); BufferedImage bi = new BufferedImage(sw, sh, BufferedImage.TYPE_INT_RGB); Graphics2D tG2 = bi.createGraphics(); tG2.setBackground(WHITE); tG2.clearRect(0, 0, sw, sh); tG2.setColor(LIGHT_GRAY); tl.draw(tG2, 0, tl.getAscent()); Rectangle r = new Rectangle(0, 0, sw, sh); return new TexturePaint(bi, r); } public GradientPaint getGradientPaint() { return new GradientPaint(0, 0, WHITE, 80, 0, GREEN); } public class Surface extends JPanel { public boolean clickedFrame; private int num; private TextureChooser tc; private boolean enterExitFrame = false; private Object t; public Surface(final Object t, final TextureChooser tc, int num) { setBackground(WHITE); this.t = t; this.tc = tc; this.clickedFrame = (num == tc.num); this.num = num; if (num == tc.num) { tc.texture = t; } addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { tc.texture = t; clickedFrame = true; for (Component comp : tc.getComponents()) { if (comp instanceof Surface) { Surface surf = (Surface) comp; if (!surf.equals(Surface.this) && surf.clickedFrame) { surf.clickedFrame = false; surf.repaint(); } } } // ABP if (demoInstVars.getControls().textureCB.isSelected()) { demoInstVars.getControls().textureCB.doClick(); demoInstVars.getControls().textureCB.doClick(); } } @Override public void mouseEntered(MouseEvent e) { enterExitFrame = true; repaint(); } @Override public void mouseExited(MouseEvent e) { enterExitFrame = false; repaint(); } }); } @Override public void paintComponent(Graphics g) { super.paintComponent(g); Graphics2D g2 = (Graphics2D) g; int w = getSize().width; int h = getSize().height; if (t instanceof TexturePaint) { g2.setPaint((TexturePaint) t); } else { g2.setPaint((GradientPaint) t); } g2.fill(new Rectangle(0, 0, w, h)); if (clickedFrame || enterExitFrame) { g2.setColor(GRAY); BasicStroke bs = new BasicStroke(3, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER); g2.setStroke(bs); g2.drawRect(0, 0, w - 1, h - 1); tc.num = num; } } @Override public Dimension getMinimumSize() { return getPreferredSize(); } @Override public Dimension getMaximumSize() { return getPreferredSize(); } @Override public Dimension getPreferredSize() { return new Dimension(30, 30); } } public static void main(String s[]) { Frame f = new Frame("J2D Demo - TextureChooser"); f.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); f.add("Center", new TextureChooser(0, new DemoInstVarsAccessorImplBase())); f.pack(); f.setSize(new Dimension(400, 400)); f.setVisible(true); } }