/* * Copyright (c) 1997, 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. */ /* * This source code is provided to illustrate the usage of a given feature * or technique and has been deliberately simplified. Additional steps * required for a production-quality application, such as security checks, * input validation and proper error handling, might not be present in * this sample code. */ import java.awt.*; import java.util.*; import java.awt.event.*; import java.applet.Applet; @SuppressWarnings("serial") class GraphicsPanel extends Panel { ActionListener al; ItemListener il; public GraphicsCards cards; GraphicsPanel(EventListener listener) { al = (ActionListener) listener; il = (ItemListener) listener; setLayout(new BorderLayout()); add("Center", cards = new GraphicsCards()); Panel p = new Panel(); //p.setLayout(new BorderLayout()); Button b = new Button("next"); b.addActionListener(al); p.add(b); b = new Button("previous"); b.addActionListener(al); p.add(b); p.add(new Label("go to:", Label.RIGHT)); Choice c = new Choice(); c.addItemListener(il); p.add(c); c.addItem("Arc"); c.addItem("Oval"); c.addItem("Polygon"); c.addItem("Rect"); c.addItem("RoundRect"); add("North", p); setSize(400, 400); } @Override public Dimension getPreferredSize() { return new Dimension(200, 100); } } @SuppressWarnings("serial") public class GraphicsTest extends Applet implements ActionListener, ItemListener { GraphicsPanel mainPanel; @Override public void init() { setLayout(new BorderLayout()); add("Center", mainPanel = new GraphicsPanel(this)); } @Override public void destroy() { remove(mainPanel); } @Override public void actionPerformed(ActionEvent e) { String arg = e.getActionCommand(); if ("next".equals(arg)) { ((CardLayout) mainPanel.cards.getLayout()).next(mainPanel.cards); } else if ("previous".equals(arg)) { ((CardLayout) mainPanel.cards.getLayout()).previous(mainPanel.cards); } } @Override public void itemStateChanged(ItemEvent e) { ((CardLayout) mainPanel.cards.getLayout()).show(mainPanel.cards, (String) e.getItem()); } public static void main(String args[]) { AppletFrame.startApplet("GraphicsTest", "Graphics Test", args); } @Override public String getAppletInfo() { return "An interactive demonstration of some graphics."; } } // end class GraphicsTest @SuppressWarnings("serial") class GraphicsCards extends Panel { public GraphicsCards() { setLayout(new CardLayout()); add("Arc", new ArcCard()); add("Oval", new ShapeTest(new OvalShape())); add("Polygon", new ShapeTest(new PolygonShape())); add("Rect", new ShapeTest(new RectShape())); add("RoundRect", new ShapeTest(new RoundRectShape())); } } // end class GraphicsCards @SuppressWarnings("serial") class ArcCard extends Panel { public ArcCard() { setLayout(new GridLayout(0, 2)); add(new ArcPanel(true)); add(new ArcPanel(false)); add(new ArcDegreePanel(true)); add(new ArcDegreePanel(false)); } } // end class ArcCard @SuppressWarnings("serial") class ArcDegreePanel extends Panel { boolean filled; public ArcDegreePanel(boolean filled) { this.filled = filled; } void arcSteps(Graphics g, int step, int x, int y, int w, int h, Color c1, Color c2) { int a1 = 0; int a2 = step; int progress = 0; g.setColor(c1); for (; (a1 + a2) <= 360; a1 = a1 + a2, a2 += 1) { if (g.getColor() == c1) { g.setColor(c2); } else { g.setColor(c1); } if (filled) { g.fillArc(x, y, w, h, a1, a2); } else { g.drawArc(x, y, w, h, a1, a2); } progress = a1 + a2; } // end for if (progress != 360) { if (filled) { g.fillArc(x, y, w, h, a1, 360 - progress); } else { g.drawArc(x, y, w, h, a1, 360 - progress); } } // end if } // end arcSteps() @Override public void paint(Graphics g) { Rectangle r = getBounds(); arcSteps(g, 3, 0, 0, r.width, r.height, Color.orange, Color.blue); arcSteps(g, 2, r.width / 4, r.height / 4, r.width / 2, r.height / 2, Color.yellow, Color.green); arcSteps(g, 1, (r.width * 3) / 8, (r.height * 3) / 8, r.width / 4, r.height / 4, Color.magenta, Color.white); } // end paint() } // end class ArcDegreePanel @SuppressWarnings("serial") class ArcPanel extends Panel { boolean filled; public ArcPanel(boolean filled) { this.filled = filled; } @Override public void paint(Graphics g) { Rectangle r = getBounds(); g.setColor(Color.yellow); if (filled) { g.fillArc(0, 0, r.width, r.height, 0, 45); } else { g.drawArc(0, 0, r.width, r.height, 0, 45); } g.setColor(Color.green); if (filled) { g.fillArc(0, 0, r.width, r.height, 90, -45); } else { g.drawArc(0, 0, r.width, r.height, 90, -45); } g.setColor(Color.orange); if (filled) { g.fillArc(0, 0, r.width, r.height, 135, -45); } else { g.drawArc(0, 0, r.width, r.height, 135, -45); } g.setColor(Color.magenta); if (filled) { g.fillArc(0, 0, r.width, r.height, -225, 45); } else { g.drawArc(0, 0, r.width, r.height, -225, 45); } g.setColor(Color.yellow); if (filled) { g.fillArc(0, 0, r.width, r.height, 225, -45); } else { g.drawArc(0, 0, r.width, r.height, 225, -45); } g.setColor(Color.green); if (filled) { g.fillArc(0, 0, r.width, r.height, -135, 45); } else { g.drawArc(0, 0, r.width, r.height, -135, 45); } g.setColor(Color.orange); if (filled) { g.fillArc(0, 0, r.width, r.height, -45, -45); } else { g.drawArc(0, 0, r.width, r.height, -45, -45); } g.setColor(Color.magenta); if (filled) { g.fillArc(0, 0, r.width, r.height, 315, 45); } else { g.drawArc(0, 0, r.width, r.height, 315, 45); } } // end paint() } // end class ArcPanel abstract class Shape { abstract void draw(Graphics g, int x, int y, int w, int h); abstract void fill(Graphics g, int x, int y, int w, int h); } class RectShape extends Shape { @Override void draw(Graphics g, int x, int y, int w, int h) { g.drawRect(x, y, w, h); } @Override void fill(Graphics g, int x, int y, int w, int h) { g.fillRect(x, y, w, h); } } class OvalShape extends Shape { @Override void draw(Graphics g, int x, int y, int w, int h) { g.drawOval(x, y, w, h); } @Override void fill(Graphics g, int x, int y, int w, int h) { g.fillOval(x, y, w, h); } } class RoundRectShape extends Shape { @Override void draw(Graphics g, int x, int y, int w, int h) { g.drawRoundRect(x, y, w, h, 10, 10); } @Override void fill(Graphics g, int x, int y, int w, int h) { g.fillRoundRect(x, y, w, h, 10, 10); } } class PolygonShape extends Shape { // class variables Polygon p; Polygon pBase; public PolygonShape() { pBase = new Polygon(); pBase.addPoint(0, 0); pBase.addPoint(10, 0); pBase.addPoint(5, 15); pBase.addPoint(10, 20); pBase.addPoint(5, 20); pBase.addPoint(0, 10); pBase.addPoint(0, 0); } void scalePolygon(float w, float h) { p = new Polygon(); for (int i = 0; i < pBase.npoints; ++i) { p.addPoint((int) (pBase.xpoints[i] * w), (int) (pBase.ypoints[i] * h)); } } @Override void draw(Graphics g, int x, int y, int w, int h) { Graphics ng = g.create(); try { ng.translate(x, y); scalePolygon(((float) w / 10f), ((float) h / 20f)); ng.drawPolygon(p); } finally { ng.dispose(); } } @Override void fill(Graphics g, int x, int y, int w, int h) { Graphics ng = g.create(); try { ng.translate(x, y); scalePolygon(((float) w / 10f), ((float) h / 20f)); ng.fillPolygon(p); } finally { ng.dispose(); } } } @SuppressWarnings("serial") class ShapeTest extends Panel { Shape shape; int step; public ShapeTest(Shape shape, int step) { this.shape = shape; this.step = step; } public ShapeTest(Shape shape) { this(shape, 10); } @Override public void paint(Graphics g) { Rectangle bounds = getBounds(); int cx, cy, cw, ch; Color color; for (color = Color.red, cx = bounds.x, cy = bounds.y, cw = bounds.width / 2, ch = bounds.height; cw > 0 && ch > 0; cx += step, cy += step, cw -= (step * 2), ch -= (step * 2), color = ColorUtils.darker(color, 0.9)) { g.setColor(color); shape.draw(g, cx, cy, cw, ch); } for (cx = bounds.x + bounds.width / 2, cy = bounds.y, cw = bounds.width / 2, ch = bounds.height; cw > 0 && ch > 0; cx += step, cy += step, cw -= (step * 2), ch -= (step * 2)) { if (g.getColor() == Color.red) { g.setColor(Color.blue); } else { g.setColor(Color.red); } shape.fill(g, cx, cy, cw, ch); } // end for } // end paint() } // end class ShapeTest class ColorUtils { static Color brighter(Color c, double factor) { return new Color(Math.min((int) (c.getRed() * (1 / factor)), 255), Math.min((int) (c.getGreen() * (1 / factor)), 255), Math.min((int) (c.getBlue() * (1 / factor)), 255)); } static Color darker(Color c, double factor) { return new Color(Math.max((int) (c.getRed() * factor), 0), Math.max((int) (c.getGreen() * factor), 0), Math.max((int) (c.getBlue() * factor), 0)); } }