Bar Chart) in java

Will ich ändern, die Höhe der einzelnen Balken (zum Beispiel 10 für den roten Teil und 20 für den blauen Teil). Aber wenn ich vergrößern Sie die Höhe der Wert, den es erhöht das Diagramm von unten, während ich will, dass die änderung top! Weißt du, was ist Los mit ihm?

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);
 }
}

InformationsquelleAutor SunyGirl | 2011-07-27

Schreibe einen Kommentar