<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F2D_Graphics_GUI%2FChart</id>
		<title>Java/2D Graphics GUI/Chart - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://www.jexp.ru/index.php?action=history&amp;feed=atom&amp;title=Java%2F2D_Graphics_GUI%2FChart"/>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Chart&amp;action=history"/>
		<updated>2026-04-18T22:15:06Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Chart&amp;diff=8143&amp;oldid=prev</id>
		<title>Admin: 1 версия</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Chart&amp;diff=8143&amp;oldid=prev"/>
				<updated>2010-06-01T06:55:09Z</updated>
		
		<summary type="html">&lt;p&gt;1 версия&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr style=&quot;vertical-align: top;&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: white; color:black; text-align: center;&quot;&gt;Версия 06:55, 1 июня 2010&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; style=&quot;text-align: center;&quot; lang=&quot;ru&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(нет различий)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Admin</name></author>	</entry>

	<entry>
		<id>http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Chart&amp;diff=8142&amp;oldid=prev</id>
		<title> в 18:01, 31 мая 2010</title>
		<link rel="alternate" type="text/html" href="http://www.jexp.ru/index.php?title=Java/2D_Graphics_GUI/Chart&amp;diff=8142&amp;oldid=prev"/>
				<updated>2010-05-31T18:01:46Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Demo bar chart and pie chart ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt; &lt;br /&gt;
import java.awt.BasicStroke;&lt;br /&gt;
import java.awt.BorderLayout;&lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.GradientPaint;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Graphics2D;&lt;br /&gt;
import java.awt.GridLayout;&lt;br /&gt;
import java.awt.Image;&lt;br /&gt;
import java.awt.Rectangle;&lt;br /&gt;
import java.awt.RenderingHints;&lt;br /&gt;
import java.awt.Shape;&lt;br /&gt;
import java.awt.Stroke;&lt;br /&gt;
import java.awt.event.ruponentEvent;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.awt.event.WindowListener;&lt;br /&gt;
import java.awt.geom.AffineTransform;&lt;br /&gt;
import java.awt.geom.Arc2D;&lt;br /&gt;
import java.awt.geom.GeneralPath;&lt;br /&gt;
import java.awt.geom.Rectangle2D;&lt;br /&gt;
import javax.swing.ImageIcon;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JLabel;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
public class Charts2D extends JFrame {&lt;br /&gt;
  public Charts2D() {&lt;br /&gt;
    super(&amp;quot;2D Charts&amp;quot;);&lt;br /&gt;
    setSize(720, 280);&lt;br /&gt;
    getContentPane().setLayout(new GridLayout(1, 3, 10, 0));&lt;br /&gt;
    getContentPane().setBackground(Color.white);&lt;br /&gt;
    int[] xData = new int[8];&lt;br /&gt;
    int[] yData = new int[8];&lt;br /&gt;
    for (int i = 0; i &amp;lt; xData.length; i++) {&lt;br /&gt;
      xData[i] = i;&lt;br /&gt;
      yData[i] = (int) (Math.random() * 100);&lt;br /&gt;
      if (i &amp;gt; 0)&lt;br /&gt;
        yData[i] = (yData[i - 1] + yData[i]) / 2;&lt;br /&gt;
    }&lt;br /&gt;
    JChart2D chart = new JChart2D(JChart2D.LineChart, xData.length, xData, yData,&lt;br /&gt;
        &amp;quot;Line Chart&amp;quot;);&lt;br /&gt;
    chart.setStroke(new BasicStroke(5f, BasicStroke.CAP_ROUND,&lt;br /&gt;
        BasicStroke.JOIN_MITER));&lt;br /&gt;
    chart.setLineColor(new Color(0, 28, 28));&lt;br /&gt;
    getContentPane().add(chart);&lt;br /&gt;
    chart = new JChart2D(JChart2D.ColumnChart, xData.length, xData, yData,&lt;br /&gt;
        &amp;quot;Column Chart&amp;quot;);&lt;br /&gt;
    GradientPaint gp = new GradientPaint(0, 100, Color.white, 0, 300,&lt;br /&gt;
        Color.blue, true);&lt;br /&gt;
    chart.setGradient(gp);&lt;br /&gt;
    chart.setEffectIndex(JChart2D.Gradientffect);&lt;br /&gt;
    chart.setDrawShadow(true);&lt;br /&gt;
    getContentPane().add(chart);&lt;br /&gt;
    chart = new JChart2D(JChart2D.PieChart, xData.length, xData, yData,&lt;br /&gt;
        &amp;quot;Pie Chart&amp;quot;);&lt;br /&gt;
    ImageIcon icon = new ImageIcon(&amp;quot;largejexplogo.GIF&amp;quot;);&lt;br /&gt;
    chart.setForegroundImage(icon.getImage());&lt;br /&gt;
    chart.setEffectIndex(JChart2D.ImageEffect);&lt;br /&gt;
    chart.setDrawShadow(true);&lt;br /&gt;
    getContentPane().add(chart);&lt;br /&gt;
    WindowListener wndCloser = new WindowAdapter() {&lt;br /&gt;
      public void windowClosing(WindowEvent e) {&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
    addWindowListener(wndCloser);&lt;br /&gt;
    setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String argv[]) {&lt;br /&gt;
    new Charts2D();&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class JChart2D extends JPanel {&lt;br /&gt;
  public static final int LineChart = 0;&lt;br /&gt;
  public static final int ColumnChart = 1;&lt;br /&gt;
  public static final int PieChart = 2;&lt;br /&gt;
  public static final int PLainEffect = 0;&lt;br /&gt;
  public static final int Gradientffect = 1;&lt;br /&gt;
  public static final int ImageEffect = 2;&lt;br /&gt;
  protected int m_chartType = LineChart;&lt;br /&gt;
  protected JLabel titleLabel;&lt;br /&gt;
  protected ChartPanel chartPanel;&lt;br /&gt;
  protected int dataLength;&lt;br /&gt;
  protected int[] xData;&lt;br /&gt;
  protected int[] yData;&lt;br /&gt;
  protected int xMin;&lt;br /&gt;
  protected int xMax;&lt;br /&gt;
  protected int yMin;&lt;br /&gt;
  protected int yMax;&lt;br /&gt;
  protected double[] pieData;&lt;br /&gt;
  protected int m_effectIndex = PLainEffect;&lt;br /&gt;
  protected Stroke stroke;&lt;br /&gt;
  protected GradientPaint gradient;&lt;br /&gt;
  protected Image foregroundImage;&lt;br /&gt;
  protected Color lineColor = Color.black;&lt;br /&gt;
  protected Color columnColor = Color.blue;&lt;br /&gt;
  protected int columnWidth = 12;&lt;br /&gt;
  protected boolean drawShadow = false;&lt;br /&gt;
  public JChart2D(int type, int nData, int[] yData, String text) {&lt;br /&gt;
    this(type, nData, null, yData, text);&lt;br /&gt;
  }&lt;br /&gt;
  public JChart2D(int type, int nData, int[] xD, int[] yD, String text) {&lt;br /&gt;
    super(new BorderLayout());&lt;br /&gt;
    setBackground(Color.white);&lt;br /&gt;
    titleLabel = new JLabel(text, JLabel.CENTER);&lt;br /&gt;
    add(titleLabel, BorderLayout.NORTH);&lt;br /&gt;
    m_chartType = type;&lt;br /&gt;
    if (xData == null) {&lt;br /&gt;
      xData = new int[nData];&lt;br /&gt;
      for (int k = 0; k &amp;lt; nData; k++)&lt;br /&gt;
        xData[k] = k;&lt;br /&gt;
    }&lt;br /&gt;
    if (yD == null)&lt;br /&gt;
      throw new IllegalArgumentException(&amp;quot;yData can&amp;quot;t be null&amp;quot;);&lt;br /&gt;
    if (nData &amp;gt; yD.length)&lt;br /&gt;
      throw new IllegalArgumentException(&amp;quot;Insufficient yData length&amp;quot;);&lt;br /&gt;
    if (nData &amp;gt; xD.length)&lt;br /&gt;
      throw new IllegalArgumentException(&amp;quot;Insufficient xData length&amp;quot;);&lt;br /&gt;
    dataLength = nData;&lt;br /&gt;
    xData = xD;&lt;br /&gt;
    yData = yD;&lt;br /&gt;
    xMin = xMax = 0; // To include 0 into the interval&lt;br /&gt;
    yMin = yMax = 0;&lt;br /&gt;
    for (int k = 0; k &amp;lt; dataLength; k++) {&lt;br /&gt;
      xMin = Math.min(xMin, xData[k]);&lt;br /&gt;
      xMax = Math.max(xMax, xData[k]);&lt;br /&gt;
      yMin = Math.min(yMin, yData[k]);&lt;br /&gt;
      yMax = Math.max(yMax, yData[k]);&lt;br /&gt;
    }&lt;br /&gt;
    if (xMin == xMax)&lt;br /&gt;
      xMax++;&lt;br /&gt;
    if (yMin == yMax)&lt;br /&gt;
      yMax++;&lt;br /&gt;
    if (m_chartType == PieChart) {&lt;br /&gt;
      double sum = 0;&lt;br /&gt;
      for (int k = 0; k &amp;lt; dataLength; k++) {&lt;br /&gt;
        yData[k] = Math.max(yData[k], 0);&lt;br /&gt;
        sum += yData[k];&lt;br /&gt;
      }&lt;br /&gt;
      pieData = new double[dataLength];&lt;br /&gt;
      for (int k = 0; k &amp;lt; dataLength; k++)&lt;br /&gt;
        pieData[k] = yData[k] * 360.0 / sum;&lt;br /&gt;
    }&lt;br /&gt;
    chartPanel = new ChartPanel();&lt;br /&gt;
    add(chartPanel, BorderLayout.CENTER);&lt;br /&gt;
  }&lt;br /&gt;
  public void setEffectIndex(int effectIndex) {&lt;br /&gt;
    m_effectIndex = effectIndex;&lt;br /&gt;
    repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public int getEffectIndex() {&lt;br /&gt;
    return m_effectIndex;&lt;br /&gt;
  }&lt;br /&gt;
  public void setStroke(Stroke s) {&lt;br /&gt;
    stroke = s;&lt;br /&gt;
    chartPanel.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public void setForegroundImage(Image img) {&lt;br /&gt;
    foregroundImage = img;&lt;br /&gt;
    repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public Image getForegroundImage() {&lt;br /&gt;
    return foregroundImage;&lt;br /&gt;
  }&lt;br /&gt;
  public Stroke getStroke() {&lt;br /&gt;
    return stroke;&lt;br /&gt;
  }&lt;br /&gt;
  public void setGradient(GradientPaint g) {&lt;br /&gt;
    gradient = g;&lt;br /&gt;
    repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public GradientPaint getGradient() {&lt;br /&gt;
    return gradient;&lt;br /&gt;
  }&lt;br /&gt;
  public void setColumnWidth(int c) {&lt;br /&gt;
    columnWidth = c;&lt;br /&gt;
    chartPanel.calcDimensions();&lt;br /&gt;
    chartPanel.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public int setColumnWidth() {&lt;br /&gt;
    return columnWidth;&lt;br /&gt;
  }&lt;br /&gt;
  public void setColumnColor(Color c) {&lt;br /&gt;
    columnColor = c;&lt;br /&gt;
    chartPanel.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public Color getColumnColor() {&lt;br /&gt;
    return columnColor;&lt;br /&gt;
  }&lt;br /&gt;
  public void setLineColor(Color c) {&lt;br /&gt;
    lineColor = c;&lt;br /&gt;
    chartPanel.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public Color getLineColor() {&lt;br /&gt;
    return lineColor;&lt;br /&gt;
  }&lt;br /&gt;
  public void setDrawShadow(boolean d) {&lt;br /&gt;
    drawShadow = d;&lt;br /&gt;
    chartPanel.repaint();&lt;br /&gt;
  }&lt;br /&gt;
  public boolean getDrawShadow() {&lt;br /&gt;
    return drawShadow;&lt;br /&gt;
  }&lt;br /&gt;
  class ChartPanel extends JComponent {&lt;br /&gt;
    int xMargin = 5;&lt;br /&gt;
    int yMargin = 5;&lt;br /&gt;
    int pieGap = 10;&lt;br /&gt;
    int m_x;&lt;br /&gt;
    int m_y;&lt;br /&gt;
    int m_w;&lt;br /&gt;
    int m_h;&lt;br /&gt;
    ChartPanel() {&lt;br /&gt;
      enableEvents(ComponentEvent.ruPONENT_RESIZED);&lt;br /&gt;
    }&lt;br /&gt;
    protected void processComponentEvent(ComponentEvent e) {&lt;br /&gt;
      calcDimensions();&lt;br /&gt;
    }&lt;br /&gt;
    public void calcDimensions() {&lt;br /&gt;
      Dimension d = getSize();&lt;br /&gt;
      m_x = xMargin;&lt;br /&gt;
      m_y = yMargin;&lt;br /&gt;
      m_w = d.width - 2 * xMargin;&lt;br /&gt;
      m_h = d.height - 2 * yMargin;&lt;br /&gt;
      if (m_chartType == ColumnChart) {&lt;br /&gt;
        m_x += columnWidth / 2;&lt;br /&gt;
        m_w -= columnWidth;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    public int xChartToScreen(int x) {&lt;br /&gt;
      return m_x + (x - xMin) * m_w / (xMax - xMin);&lt;br /&gt;
    }&lt;br /&gt;
    public int yChartToScreen(int y) {&lt;br /&gt;
      return m_y + (yMax - y) * m_h / (yMax - yMin);&lt;br /&gt;
    }&lt;br /&gt;
    public void paintComponent(Graphics g) {&lt;br /&gt;
      int x0 = 0;&lt;br /&gt;
      int y0 = 0;&lt;br /&gt;
      if (m_chartType != PieChart) {&lt;br /&gt;
        g.setColor(Color.black);&lt;br /&gt;
        x0 = xChartToScreen(0);&lt;br /&gt;
        g.drawLine(x0, m_y, x0, m_y + m_h);&lt;br /&gt;
        y0 = yChartToScreen(0);&lt;br /&gt;
        g.drawLine(m_x, y0, m_x + m_w, y0);&lt;br /&gt;
      }&lt;br /&gt;
      Graphics2D g2 = (Graphics2D) g;&lt;br /&gt;
      g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,&lt;br /&gt;
          RenderingHints.VALUE_ANTIALIAS_ON);&lt;br /&gt;
      g2.setRenderingHint(RenderingHints.KEY_RENDERING,&lt;br /&gt;
          RenderingHints.VALUE_RENDER_QUALITY);&lt;br /&gt;
      if (stroke != null)&lt;br /&gt;
        g2.setStroke(stroke);&lt;br /&gt;
      GeneralPath path = new GeneralPath();&lt;br /&gt;
      switch (m_chartType) {&lt;br /&gt;
      case LineChart:&lt;br /&gt;
        g2.setColor(lineColor);&lt;br /&gt;
        path.moveTo(xChartToScreen(xData[0]),&lt;br /&gt;
            yChartToScreen(yData[0]));&lt;br /&gt;
        for (int k = 1; k &amp;lt; dataLength; k++)&lt;br /&gt;
          path.lineTo(xChartToScreen(xData[k]),&lt;br /&gt;
              yChartToScreen(yData[k]));&lt;br /&gt;
        g2.draw(path);&lt;br /&gt;
        break;&lt;br /&gt;
      case ColumnChart:&lt;br /&gt;
        for (int k = 0; k &amp;lt; dataLength; k++) {&lt;br /&gt;
          xMax++;&lt;br /&gt;
          int x = xChartToScreen(xData[k]);&lt;br /&gt;
          int w = columnWidth;&lt;br /&gt;
          int y1 = yChartToScreen(yData[k]);&lt;br /&gt;
          int y = Math.min(y0, y1);&lt;br /&gt;
          int h = Math.abs(y1 - y0);&lt;br /&gt;
          Shape rc = new Rectangle2D.Double(x, y, w, h);&lt;br /&gt;
          path.append(rc, false);&lt;br /&gt;
          xMax--;&lt;br /&gt;
        }&lt;br /&gt;
        if (drawShadow) {&lt;br /&gt;
          AffineTransform s0 = new AffineTransform(1.0, 0.0, 0.0,&lt;br /&gt;
              -1.0, x0, y0);&lt;br /&gt;
          s0.concatenate(AffineTransform.getScaleInstance(1.0, 0.5));&lt;br /&gt;
          s0.concatenate(AffineTransform.getShearInstance(0.5, 0.0));&lt;br /&gt;
          s0.concatenate(new AffineTransform(1.0, 0.0, 0.0, -1.0,&lt;br /&gt;
              -x0, y0));&lt;br /&gt;
          g2.setColor(Color.gray);&lt;br /&gt;
          Shape shadow = s0.createTransformedShape(path);&lt;br /&gt;
          g2.fill(shadow);&lt;br /&gt;
        }&lt;br /&gt;
        if (m_effectIndex == Gradientffect &amp;amp;&amp;amp; gradient != null) {&lt;br /&gt;
          g2.setPaint(gradient);&lt;br /&gt;
          g2.fill(path);&lt;br /&gt;
        } else if (m_effectIndex == ImageEffect&lt;br /&gt;
            &amp;amp;&amp;amp; foregroundImage != null)&lt;br /&gt;
          fillByImage(g2, path, 0);&lt;br /&gt;
        else {&lt;br /&gt;
          g2.setColor(columnColor);&lt;br /&gt;
          g2.fill(path);&lt;br /&gt;
        }&lt;br /&gt;
        g2.setColor(lineColor);&lt;br /&gt;
        g2.draw(path);&lt;br /&gt;
        break;&lt;br /&gt;
      case PieChart:&lt;br /&gt;
        double start = 0.0;&lt;br /&gt;
        double finish = 0.0;&lt;br /&gt;
        int ww = m_w - 2 * pieGap;&lt;br /&gt;
        int hh = m_h - 2 * pieGap;&lt;br /&gt;
        if (drawShadow) {&lt;br /&gt;
          ww -= pieGap;&lt;br /&gt;
          hh -= pieGap;&lt;br /&gt;
        }&lt;br /&gt;
        for (int i = 0; i &amp;lt; dataLength; i++) {&lt;br /&gt;
          finish = start + pieData[i];&lt;br /&gt;
          double f1 = Math.min(90 - start, 90 - finish);&lt;br /&gt;
          double f2 = Math.max(90 - start, 90 - finish);&lt;br /&gt;
          Shape shp = new Arc2D.Double(m_x, m_y, ww, hh, f1, f2 - f1,&lt;br /&gt;
              Arc2D.PIE);&lt;br /&gt;
          double f = (f1 + f2) / 2 * Math.PI / 180;&lt;br /&gt;
          AffineTransform s1 = AffineTransform.getTranslateInstance(&lt;br /&gt;
              pieGap * Math.cos(f), -pieGap * Math.sin(f));&lt;br /&gt;
          s1.translate(pieGap, pieGap);&lt;br /&gt;
          Shape piece = s1.createTransformedShape(shp);&lt;br /&gt;
          path.append(piece, false);&lt;br /&gt;
          start = finish;&lt;br /&gt;
        }&lt;br /&gt;
        if (drawShadow) {&lt;br /&gt;
          AffineTransform s0 = AffineTransform.getTranslateInstance(&lt;br /&gt;
              pieGap, pieGap);&lt;br /&gt;
          g2.setColor(Color.gray);&lt;br /&gt;
          Shape shadow = s0.createTransformedShape(path);&lt;br /&gt;
          g2.fill(shadow);&lt;br /&gt;
        }&lt;br /&gt;
        if (m_effectIndex == Gradientffect &amp;amp;&amp;amp; gradient != null) {&lt;br /&gt;
          g2.setPaint(gradient);&lt;br /&gt;
          g2.fill(path);&lt;br /&gt;
        } else if (m_effectIndex == ImageEffect&lt;br /&gt;
            &amp;amp;&amp;amp; foregroundImage != null)&lt;br /&gt;
          fillByImage(g2, path, 0);&lt;br /&gt;
        else {&lt;br /&gt;
          g2.setColor(columnColor);&lt;br /&gt;
          g2.fill(path);&lt;br /&gt;
        }&lt;br /&gt;
        g2.setColor(lineColor);&lt;br /&gt;
        g2.draw(path);&lt;br /&gt;
        break;&lt;br /&gt;
      }&lt;br /&gt;
    }&lt;br /&gt;
    protected void fillByImage(Graphics2D g2, Shape shape, int xOffset) {&lt;br /&gt;
      if (foregroundImage == null)&lt;br /&gt;
        return;&lt;br /&gt;
      int wImg = foregroundImage.getWidth(this);&lt;br /&gt;
      int hImg = foregroundImage.getHeight(this);&lt;br /&gt;
      if (wImg &amp;lt;= 0 || hImg &amp;lt;= 0)&lt;br /&gt;
        return;&lt;br /&gt;
      g2.setClip(shape);&lt;br /&gt;
      Rectangle bounds = shape.getBounds();&lt;br /&gt;
      for (int i = bounds.x + xOffset; i &amp;lt; bounds.x + bounds.width; i += wImg)&lt;br /&gt;
        for (int j = bounds.y; j &amp;lt; bounds.y + bounds.height; j += hImg)&lt;br /&gt;
          g2.drawImage(foregroundImage, i, j, this);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Drawing a Pie Chart ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt;  &lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.Graphics2D;&lt;br /&gt;
import java.awt.Rectangle;&lt;br /&gt;
import javax.swing.JComponent;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
class Slice {&lt;br /&gt;
  double value;&lt;br /&gt;
  Color color;&lt;br /&gt;
  public Slice(double value, Color color) {&lt;br /&gt;
    this.value = value;&lt;br /&gt;
    this.color = color;&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
class MyComponent extends JComponent {&lt;br /&gt;
  Slice[] slices = { new Slice(5, Color.black), new Slice(33, Color.green),&lt;br /&gt;
      new Slice(20, Color.yellow), new Slice(15, Color.red) };&lt;br /&gt;
  MyComponent() {&lt;br /&gt;
  }&lt;br /&gt;
  public void paint(Graphics g) {&lt;br /&gt;
    drawPie((Graphics2D) g, getBounds(), slices);&lt;br /&gt;
  }&lt;br /&gt;
  void drawPie(Graphics2D g, Rectangle area, Slice[] slices) {&lt;br /&gt;
    double total = 0.0D;&lt;br /&gt;
    for (int i = 0; i &amp;lt; slices.length; i++) {&lt;br /&gt;
      total += slices[i].value;&lt;br /&gt;
    }&lt;br /&gt;
    double curValue = 0.0D;&lt;br /&gt;
    int startAngle = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; slices.length; i++) {&lt;br /&gt;
      startAngle = (int) (curValue * 360 / total);&lt;br /&gt;
      int arcAngle = (int) (slices[i].value * 360 / total);&lt;br /&gt;
      g.setColor(slices[i].color);&lt;br /&gt;
      g.fillArc(area.x, area.y, area.width, area.height, startAngle, arcAngle);&lt;br /&gt;
      curValue += slices[i].value;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
public class PieChart {&lt;br /&gt;
  public static void main(String[] argv) {&lt;br /&gt;
    JFrame frame = new JFrame();&lt;br /&gt;
    frame.getContentPane().add(new MyComponent());&lt;br /&gt;
    frame.setSize(300, 200);&lt;br /&gt;
    frame.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
   &lt;br /&gt;
    &lt;br /&gt;
  &amp;lt;/source&amp;gt;   &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Simple bar chart ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
   &lt;br /&gt;
&amp;lt;source lang=&amp;quot;java&amp;quot;&amp;gt; &lt;br /&gt;
import java.awt.Color;&lt;br /&gt;
import java.awt.Dimension;&lt;br /&gt;
import java.awt.Font;&lt;br /&gt;
import java.awt.FontMetrics;&lt;br /&gt;
import java.awt.Graphics;&lt;br /&gt;
import java.awt.event.WindowAdapter;&lt;br /&gt;
import java.awt.event.WindowEvent;&lt;br /&gt;
import java.awt.event.WindowListener;&lt;br /&gt;
import javax.swing.JFrame;&lt;br /&gt;
import javax.swing.JPanel;&lt;br /&gt;
public class ChartPanel extends JPanel {&lt;br /&gt;
  private double[] values;&lt;br /&gt;
  private String[] names;&lt;br /&gt;
  private String title;&lt;br /&gt;
  public ChartPanel(double[] v, String[] n, String t) {&lt;br /&gt;
    names = n;&lt;br /&gt;
    values = v;&lt;br /&gt;
    title = t;&lt;br /&gt;
  }&lt;br /&gt;
  public void paintComponent(Graphics g) {&lt;br /&gt;
    super.paintComponent(g);&lt;br /&gt;
    if (values == null || values.length == 0)&lt;br /&gt;
      return;&lt;br /&gt;
    double minValue = 0;&lt;br /&gt;
    double maxValue = 0;&lt;br /&gt;
    for (int i = 0; i &amp;lt; values.length; i++) {&lt;br /&gt;
      if (minValue &amp;gt; values[i])&lt;br /&gt;
        minValue = values[i];&lt;br /&gt;
      if (maxValue &amp;lt; values[i])&lt;br /&gt;
        maxValue = values[i];&lt;br /&gt;
    }&lt;br /&gt;
    Dimension d = getSize();&lt;br /&gt;
    int clientWidth = d.width;&lt;br /&gt;
    int clientHeight = d.height;&lt;br /&gt;
    int barWidth = clientWidth / values.length;&lt;br /&gt;
    Font titleFont = new Font(&amp;quot;SansSerif&amp;quot;, Font.BOLD, 20);&lt;br /&gt;
    FontMetrics titleFontMetrics = g.getFontMetrics(titleFont);&lt;br /&gt;
    Font labelFont = new Font(&amp;quot;SansSerif&amp;quot;, Font.PLAIN, 10);&lt;br /&gt;
    FontMetrics labelFontMetrics = g.getFontMetrics(labelFont);&lt;br /&gt;
    int titleWidth = titleFontMetrics.stringWidth(title);&lt;br /&gt;
    int y = titleFontMetrics.getAscent();&lt;br /&gt;
    int x = (clientWidth - titleWidth) / 2;&lt;br /&gt;
    g.setFont(titleFont);&lt;br /&gt;
    g.drawString(title, x, y);&lt;br /&gt;
    int top = titleFontMetrics.getHeight();&lt;br /&gt;
    int bottom = labelFontMetrics.getHeight();&lt;br /&gt;
    if (maxValue == minValue)&lt;br /&gt;
      return;&lt;br /&gt;
    double scale = (clientHeight - top - bottom) / (maxValue - minValue);&lt;br /&gt;
    y = clientHeight - labelFontMetrics.getDescent();&lt;br /&gt;
    g.setFont(labelFont);&lt;br /&gt;
    for (int i = 0; i &amp;lt; values.length; i++) {&lt;br /&gt;
      int valueX = i * barWidth + 1;&lt;br /&gt;
      int valueY = top;&lt;br /&gt;
      int height = (int) (values[i] * scale);&lt;br /&gt;
      if (values[i] &amp;gt;= 0)&lt;br /&gt;
        valueY += (int) ((maxValue - values[i]) * scale);&lt;br /&gt;
      else {&lt;br /&gt;
        valueY += (int) (maxValue * scale);&lt;br /&gt;
        height = -height;&lt;br /&gt;
      }&lt;br /&gt;
      g.setColor(Color.red);&lt;br /&gt;
      g.fillRect(valueX, valueY, barWidth - 2, height);&lt;br /&gt;
      g.setColor(Color.black);&lt;br /&gt;
      g.drawRect(valueX, valueY, barWidth - 2, height);&lt;br /&gt;
      int labelWidth = labelFontMetrics.stringWidth(names[i]);&lt;br /&gt;
      x = i * barWidth + (barWidth - labelWidth) / 2;&lt;br /&gt;
      g.drawString(names[i], x, y);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  public static void main(String[] argv) {&lt;br /&gt;
    JFrame f = new JFrame();&lt;br /&gt;
    f.setSize(400, 300);&lt;br /&gt;
    double[] values = new double[3];&lt;br /&gt;
    String[] names = new String[3];&lt;br /&gt;
    values[0] = 1;&lt;br /&gt;
    names[0] = &amp;quot;Item 1&amp;quot;;&lt;br /&gt;
    values[1] = 2;&lt;br /&gt;
    names[1] = &amp;quot;Item 2&amp;quot;;&lt;br /&gt;
    values[2] = 4;&lt;br /&gt;
    names[2] = &amp;quot;Item 3&amp;quot;;&lt;br /&gt;
    f.getContentPane().add(new ChartPanel(values, names, &amp;quot;title&amp;quot;));&lt;br /&gt;
    WindowListener wndCloser = new WindowAdapter() {&lt;br /&gt;
      public void windowClosing(WindowEvent e) {&lt;br /&gt;
        System.exit(0);&lt;br /&gt;
      }&lt;br /&gt;
    };&lt;br /&gt;
    f.addWindowListener(wndCloser);&lt;br /&gt;
    f.setVisible(true);&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
           &lt;br /&gt;
         &lt;br /&gt;
  &amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
			</entry>

	</feed>