title: Bar Chart in java
body: <p>I want to change the height of each bar (for example 10 for red part and 20 for blue part). But when I increase the height value it will increase the chart from bottom whereas I want the change to top! Do you know what is wrong with it?</p>
  
  <pre><code>import java.awt.Color;
  import java.awt.Dimension;
  import java.awt.Font;
  import java.awt.FontMetrics;
  import java.awt.Graphics;
  import java.awt.event.WindowAdapter;
  import java.awt.event.WindowEvent;
  import java.awt.event.WindowListener;
  import javax.swing.JFrame;
  import javax.swing.JPanel;
  
  public class ChartPanel extends JPanel {
    private double[] values;
    private String[] names;
    private String title;
  
  public ChartPanel(double[] v, String[] n, String t) {
   names = n;
   values = v;
   title = t;
  }
  
  public void paintComponent(Graphics g) {
   super.paintComponent(g);
   if (values == null || values.length == 0)
    return;
   double minValue = 0;
   double maxValue = 0;
   for (int i = 0; i &lt; values.length; i++) {
     if (minValue &gt; values[i])
       minValue = values[i];
     if (maxValue &lt; values[i])
       maxValue = values[i];
    }
  
  Dimension d = getSize();
  int clientWidth = d.width;
  int clientHeight = d.height;
  int barWidth = clientWidth / values.length;
  
  Font titleFont = new Font("SansSerif", Font.BOLD, 20);
  FontMetrics titleFontMetrics = g.getFontMetrics(titleFont);
  Font labelFont = new Font("SansSerif", Font.PLAIN, 10);
  FontMetrics labelFontMetrics = g.getFontMetrics(labelFont);
  
  int titleWidth = titleFontMetrics.stringWidth(title);
  int y = titleFontMetrics.getAscent();
  int x = (clientWidth - titleWidth) / 2;
  g.setFont(titleFont);
  g.drawString(title, x, y);
  
  int top = titleFontMetrics.getHeight();
  int bottom = labelFontMetrics.getHeight();
  if (maxValue == minValue)
    return;
  double scale = (clientHeight - top - bottom) / (maxValue - minValue);
  y = clientHeight - labelFontMetrics.getDescent();
  g.setFont(labelFont);
  
  for (int i = 0; i &lt; values.length; i++) {
    int valueX = i * barWidth + 1;
    int valueY = top;
    int height = (int) (values[i] * scale);
    if (values[i] &gt;= 0)
      valueY += (int) ((maxValue - values[i]) * scale);
    else {
      valueY += (int) (maxValue * scale);
      height = -height;
    }
  
    g.setColor(Color.red);
    g.fillRect(valueX, valueY, barWidth - 80, height);
    g.setColor(Color.black);
    g.drawRect(valueX, valueY, barWidth - 80, height);
  
  
    g.setColor(Color.blue);
    g.fillRect(valueX, valueY + 20, barWidth - 80, height-20 );
    g.setColor(Color.black);
    g.drawRect(valueX, valueY + 20, barWidth - 80, height-20 );
    int labelWidth = labelFontMetrics.stringWidth(names[i]);
    x = i * barWidth + (barWidth - labelWidth) / 2;
    g.drawString(names[i], x, y);
   }
  }
  
  public static void main(String[] argv) {
  JFrame f = new JFrame();
  f.setSize(400, 300);
  double[] values = new double[3];
  String[] names = new String[3];
  values[0] = 1;
  names[0] = "Item 1";
  
  values[1] = 2;
  names[1] = "Item 2";
  
  values[2] = 4;
  names[2] = "Item 3";
  
  f.getContentPane().add(new ChartPanel(values, names, "title"));
  
  WindowListener wndCloser = new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
      System.exit(0);
     }
  };
     f.addWindowListener(wndCloser);
     f.setVisible(true);
   }
  }
  </code></pre>