/* * 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.*; /** * A simple bar chart demo * @author Sami Shaio * @modified 06/21/00 Daniel Peek : refactored, comments */ @SuppressWarnings("serial") public class BarChart extends java.applet.Applet { private static final int VERTICAL = 0; private static final int HORIZONTAL = 1; private static final int SOLID = 0; private static final int STRIPED = 1; private int orientation; private String title; private Font font; private FontMetrics metrics; private int columns; private int values[]; private Color colors[]; private String labels[]; private int styles[]; private int scale = 10; private int maxLabelWidth = 0; private int barSpacing = 10; private int maxValue = 0; @Override public void init() { getSettings(); values = new int[columns]; labels = new String[columns]; styles = new int[columns]; colors = new Color[columns]; for (int i = 0; i < columns; i++) { parseValue(i); parseLabel(i); parseStyle(i); parseColor(i); } } private void getSettings() { font = new java.awt.Font("Monospaced", Font.BOLD, 12); metrics = getFontMetrics(font); title = getParameter("title"); if (title == null) { title = "Chart"; } String temp = getParameter("columns"); if (temp == null) { columns = 5; } else { columns = Integer.parseInt(temp); } temp = getParameter("scale"); if (temp == null) { scale = 10; } else { scale = Integer.parseInt(temp); } temp = getParameter("orientation"); if (temp == null) { orientation = VERTICAL; } else if (temp.equalsIgnoreCase("horizontal")) { orientation = HORIZONTAL; } else { orientation = VERTICAL; } } private void parseValue(int i) { String temp = getParameter("C" + (i + 1)); try { values[i] = Integer.parseInt(temp); } catch (NumberFormatException e) { values[i] = 0; } catch (NullPointerException e) { values[i] = 0; } maxValue = Math.max(maxValue, values[i]); } private void parseLabel(int i) { String temp = getParameter("C" + (i + 1) + "_label"); if (temp == null) { labels[i] = ""; } else { labels[i] = temp; } maxLabelWidth = Math.max(metrics.stringWidth(labels[i]), maxLabelWidth); } private void parseStyle(int i) { String temp = getParameter("C" + (i + 1) + "_style"); if (temp == null || temp.equalsIgnoreCase("solid")) { styles[i] = SOLID; } else if (temp.equalsIgnoreCase("striped")) { styles[i] = STRIPED; } else { styles[i] = SOLID; } } private void parseColor(int i) { String temp = getParameter("C" + (i + 1) + "_color"); if (temp != null) { temp = temp.toLowerCase(); if (temp.equals("red")) { colors[i] = Color.red; } else if (temp.equals("green")) { colors[i] = Color.green; } else if (temp.equals("blue")) { colors[i] = Color.blue; } else if (temp.equals("pink")) { colors[i] = Color.pink; } else if (temp.equals("orange")) { colors[i] = Color.orange; } else if (temp.equals("magenta")) { colors[i] = Color.magenta; } else if (temp.equals("cyan")) { colors[i] = Color.cyan; } else if (temp.equals("white")) { colors[i] = Color.white; } else if (temp.equals("yellow")) { colors[i] = Color.yellow; } else if (temp.equals("gray")) { colors[i] = Color.gray; } else if (temp.equals("darkgray")) { colors[i] = Color.darkGray; } else { colors[i] = Color.gray; } } else { colors[i] = Color.gray; } } @Override public void paint(Graphics g) { // draw the title centered at the bottom of the bar graph g.setColor(Color.black); g.setFont(font); g.drawRect(0, 0, getSize().width - 1, getSize().height - 1); int titleWidth = metrics.stringWidth(title); int cx = Math.max((getSize().width - titleWidth) / 2, 0); int cy = getSize().height - metrics.getDescent(); g.drawString(title, cx, cy); // draw the bars and their titles if (orientation == HORIZONTAL) { paintHorizontal(g); } else { // VERTICAL paintVertical(g); } } private void paintHorizontal(Graphics g) { // x and y coordinates to draw/write to int cx, cy; int barHeight = metrics.getHeight(); for (int i = 0; i < columns; i++) { // set the X coordinate for this bar and label and center it int widthOfItems = maxLabelWidth + 3 + (maxValue * scale) + 5 + metrics.stringWidth(Integer.toString(maxValue)); cx = Math.max((getSize().width - widthOfItems) / 2, 0); // set the Y coordinate for this bar and label cy = getSize().height - metrics.getDescent() - metrics.getHeight() - barSpacing - ((columns - i - 1) * (barSpacing + barHeight)); // draw the label g.setColor(Color.black); g.drawString(labels[i], cx, cy); cx += maxLabelWidth + 3; // draw the shadow g.fillRect(cx + 4, cy - barHeight + 4, (values[i] * scale), barHeight); // draw the bar g.setColor(colors[i]); if (styles[i] == STRIPED) { for (int k = 0; k <= values[i] * scale; k += 2) { g.drawLine(cx + k, cy - barHeight, cx + k, cy); } } else { // SOLID g.fillRect(cx, cy - barHeight, (values[i] * scale) + 1, barHeight + 1); } cx += (values[i] * scale) + 4; // draw the value at the end of the bar g.setColor(g.getColor().darker()); g.drawString(Integer.toString(values[i]), cx, cy); } } private void paintVertical(Graphics g) { int barWidth = maxLabelWidth; for (int i = 0; i < columns; i++) { // X coordinate for this label and bar (centered) int widthOfItems = (barWidth + barSpacing) * columns - barSpacing; int cx = Math.max((getSize().width - widthOfItems) / 2, 0); cx += (maxLabelWidth + barSpacing) * i; // Y coordinate for this label and bar int cy = getSize().height - metrics.getHeight() - metrics.getDescent() - 4; // draw the label g.setColor(Color.black); g.drawString(labels[i], cx, cy); cy -= metrics.getHeight() - 3; // draw the shadow g.fillRect(cx + 4, cy - (values[i] * scale) - 4, barWidth, (values[i] * scale)); // draw the bar g.setColor(colors[i]); if (styles[i] == STRIPED) { for (int k = 0; k <= values[i] * scale; k += 2) { g.drawLine(cx, cy - k, cx + barWidth, cy - k); } } else { g.fillRect(cx, cy - (values[i] * scale), barWidth + 1, (values[i] * scale) + 1); } cy -= (values[i] * scale) + 5; // draw the value on top of the bar g.setColor(g.getColor().darker()); g.drawString(Integer.toString(values[i]), cx, cy); } } @Override public String getAppletInfo() { return "Title: Bar Chart \n" + "Author: Sami Shaio \n" + "A simple bar chart demo."; } @Override public String[][] getParameterInfo() { String[][] info = { { "title", "string", "The title of bar graph. Default is 'Chart'" }, { "scale", "int", "The scale of the bar graph. Default is 10." }, { "columns", "int", "The number of columns/rows. Default is 5." }, { "orientation", "{VERTICAL, HORIZONTAL}", "The orienation of the bar graph. Default is VERTICAL." }, { "c#", "int", "Subsitute a number for #. " + "The value/size of bar #. Default is 0." }, { "c#_label", "string", "The label for bar #. " + "Default is an empty label." }, { "c#_style", "{SOLID, STRIPED}", "The style of bar #. " + "Default is SOLID." }, { "c#_color", "{RED, GREEN, BLUE, PINK, ORANGE, MAGENTA, CYAN, " + "WHITE, YELLOW, GRAY, DARKGRAY}", "The color of bar #. Default is GRAY." } }; return info; } }