Balkendiagramm Graphics2D

Tarsuinn

Grünschnabel
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

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);
    }
}
 
So zeichnest Du die Säulen:

Java:
  for (int i = 0; i < 12; i++) {
    g2.fill(new Rectangle2D.Double(
      7 * i, 0, 7, monatswert[i] / maxWert * 85));
  }

Du zeichnest also 12 Säulen und änderst jeweils deren X-Koordinate, somit werden sie horizontal nebeneinander dargestellt. Du musst lediglich die Y-Koordinate ändern und Breite und Höhe der Säulen vertauschen, um aus Säulen horizontale Balken zu machen.

Java:
  for (int i = 0; i < 12; i++) {
    g2.fill(new Rectangle2D.Double(
      0, 7 * i, monatswert[i] / maxWert * 85, 7));
  }


Art der Javaprogrammierung? Die Kunst der Javaprogrammierung? ;) Nein, was meinst Du genau?
 
Hi danke für die Antwort hatte es jetzt mit der object.rotate(..) Methode gemacht aber so ist es einfacher. Meinte Bücher zum Thema Swing/AWT die auch auf dieses Thema (Diagramme, Geometrische Figuren) eingehen, finde nur Sachen zu Oberflächenprogrammierung, sprich Schaltflächen etc.

MfG
 

Neue Beiträge

Zurück