Gráfico de barras en java

Quiero cambiar la altura de cada barra (por ejemplo, 10 para la parte roja y 20 para la parte azul). ¡Pero cuando aumente el valor de la altura, aumentará el gráfico desde abajo mientras que quiero que el cambio sea hacia arriba! ¿Sabes qué tiene de malo?

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 < values.length; i++) {
   if (minValue > values[i])
     minValue = values[i];
   if (maxValue < 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 < values.length; i++) {
  int valueX = i * barWidth + 1;
  int valueY = top;
  int height = (int) (values[i] * scale);
  if (values[i] >= 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);
 }
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta