Hallo,
ich habe mal eine Frage zu den Methoden von Swing/AWT. Es geht dabei um das erstellen von Diagrammen, hab jetzt folgendes Diagramm und versuche die ganze Zeit die X-Achse auf die Y-Achse zu bekommen sprich die Balken sollen von links nach rechts gehen. Wo liegt der Fehler?
Zum anderen kann mir jemand ein Buch empfehlen was sich mit der Art der Javaprogrammierung beschäftigt?
MfG
ich habe mal eine Frage zu den Methoden von Swing/AWT. Es geht dabei um das erstellen von Diagrammen, hab jetzt folgendes Diagramm und versuche die ganze Zeit die X-Achse auf die Y-Achse zu bekommen sprich die Balken sollen von links nach rechts gehen. Wo liegt der Fehler?
Zum anderen kann mir jemand ein Buch empfehlen was sich mit der Art der Javaprogrammierung beschäftigt?
MfG
Code:
import java.awt.*;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import javax.swing.*;
public class Statistik extends JFrame {
class Diagramm extends JPanel {
private double maxWert;
private double monatswert[];
private void setMonatswerte(double monatswert[]) {
this.monatswert = monatswert;
maxWert = monatswert[0];
for (int i = 1; i < 12; i++) {
if (monatswert[i] > maxWert) {
maxWert = monatswert[i];
}
}
}
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
super.paintComponent(g2);
Dimension d = getSize(null);
//Skalieren auf 100x100 mit y-Invertierung
g2.scale(d.getWidth() / 100.0, -d.getHeight() / 100.0);
// Ursprung verschieben nach (15,-90)
g2.translate(15, -90);
// Linien etwas breiter
g2.setStroke(new BasicStroke(1.5f));
// x-Achse zeichnen
g2.draw(new Line2D.Double(0, 0, 85, 0));
// y-Achse zeichnen
g2.draw(new Line2D.Double(0, 0, 0, 85));
// Linien etwas dünner
g2.setStroke(new BasicStroke(0.5f));
// Farbverlauf von rot nach grün
g2.setPaint(new GradientPaint(
0f, 0f, Color.red, 0f, 85f, Color.green));
// Säulen zeichnen
for (int i = 0; i < 12; i++) {
g2.fill(new Rectangle2D.Double(
7 * i, 0, 7, monatswert[i] / maxWert * 85));
}
// konstante Farbe dunkelgrau
g2.setPaint(Color.darkGray);
// Rahmen um Säulen zeichnen
for (int i = 0; i < 12; i++) {
g2.draw(new Rectangle2D.Double(
7 * i, 0, 7, monatswert[i] / maxWert * 85));
}
// y-Invertierung rückgängig machen
g2.scale(1, -1);
// Beschriftung x-Achse
String xAchse = "JFMAMJJASOND";
// Fontgröße für Beschriftung ändern
g2.setFont(g2.getFont().deriveFont(8f));
for (int i = 0; i < 12; i++) {
g2.drawString(xAchse.substring(i, i + 1),
i * 7, +10);
}
// Beschriftung y-Achse
// Fontgröße für Beschriftung ändern
g2.setFont(g2.getFont().deriveFont(5f));
for (int i = 0; i < maxWert; i = i + 1000) {
g2.drawString(" " + i, -15,
-Math.round(((double) i) / maxWert * 85));
}
}
}
private Diagramm dgramm;
public Statistik(
String titel, int x, int y, int w, int h) {
super(titel);
this.setSize(w, h);
this.setLocation(x, y);
this.setDefaultCloseOperation(
JFrame.EXIT_ON_CLOSE);
dgramm = new Diagramm();
this.setContentPane(dgramm);
}
private double[] umsatzBerechnen() {
// zufälliges Erzeugen der Umsätze
double umsatz[] = new double[12];
for (int i = 0; i < 12; i++) {
umsatz[i] = ((double) Math.round(
(Math.random() * 500000))) / 100.0;
System.out.println("Umsatz im Monat " + (i + 1) + ": " + umsatz[i]);
}
return umsatz;
}
public static void main(String[] args) {
String titel = "Umsatz 2004";
int x = 100;
int y = 100;
int w = 300;
int h = 200;
Statistik f = new Statistik(titel, x, y, w, h);
f.dgramm.setMonatswerte(f.umsatzBerechnen());
f.setVisible(true);
}
}