String um 90° drehen

schiese

Erfahrenes Mitglied
Hallo,

ich möchte ein Koordinatensystem zeichnen und Punkte einzeichnen. Beides klappt auch super. Nun wollte ich als nächstes die Achsen beschriften. Die x-Achse habe ich hinbekommen, bei der y-Achse hänge ich jetzt schon einige Stunden fest. Ich habe Quelltext hier aus dem Forum gefunden (http://www.tutorials.de/threads/graphics2d-string-vertikal-zeichnen.205499/#post-1063737). Das Problem dabei ist, dass er mir den gesamten Inhalt des JFrames dreht. Also auch die Koordinaten der Punkte werden gedreht. Eingebunden habe ich es so:

Start
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Start extends JFrame {
   private static final long serialVersionUID = -3330800293328098089L;
  
   JPanel panel;
  
   public Start()
   {
     this.add(new MenueLinks(), BorderLayout.WEST);
     this.add(new Inhalt(),BorderLayout.CENTER);
     this.setSize(new Dimension(800,600));
     this.setLocationRelativeTo(null);
     this.setVisible(true);
   }
    
   /*
   JFrame frame;
  
   public Start()
   {
     this.setSize(new Dimension(800,600));
     this.setLocationRelativeTo(null);
     this.add(new Inhalt());
     this.setVisible(true);
   }
   */

   public static void main(String[] args)
   {
     new Start();
   }
}

Inhalt
Java:
import java.awt.Color;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;

import javax.swing.JPanel;

public class Inhalt extends JPanel {
   private static final long serialVersionUID = -1617380958931060319L;

   int[] yWerte = {2,6,8,9,3,5,7,6,3,5,7,4,2};

   private int abstandWerteXAchse;
   private double abstandWerteYAchse;
  
   private final int abstandBeschriftungXAchse = 5;
  
   private double yMax = 0;
  
   private final int abstandGitterRand = 30; // Abstand der durchgezogenen Linien senkrecht zum JPanel
   private final int minAbstandAchseJPanel = 20; // Minimaler Abstand des Endes der Korrdinatenachse zum Panelrand
   private String beschriftungXAchse;
   private String beschriftungYAchse;
   private int laengeBeschriftungXAchse;
   private int laengeBeschriftungYAchse;
  
   public Inhalt()
   {
     this.setBackground(Color.WHITE);
     this.beschriftungXAchse = "X-Achse oder ein längerer Text!";
     this.beschriftungYAchse = "Y-Achse";
   }
  
   public void paint(Graphics g)
   {
     zeichnenKoordinatensystem(g);
    
     zeichnenPunkte(g);
    
     g.drawString("Breite: "+this.getSize().getWidth()+" Höhe: "+this.getSize().getHeight(), 0, 200); // Anzeige der Größe des JPanels
    
     // Zeichnen der Punkte ##############################################################################################################
    

    
//     g.drawString(Integer.toString(abstandWerteXAchse)+ " "+Double.toString(abstandWerteYAchse)+" yMax: "+Double.toString(yMax)+" Höhe: "+fm.getHeight()+" "+Integer.toString((int)(this.getSize().getHeight() - abstandBeschriftungXAchse - fm.getHeight())),300,100);  
   }
  
   public void zeichnenKoordinatensystem(Graphics g)
   {
     Graphics2D g2d = (Graphics2D)g;
     g.drawLine(0 + abstandGitterRand, 0 + minAbstandAchseJPanel, 0 + abstandGitterRand, (int)(this.getSize().getHeight() - abstandGitterRand)); // Zeichnen der y-Achse
     g.drawLine(0 + abstandGitterRand, (int)(this.getSize().getHeight() - abstandGitterRand), (int)(this.getSize().getWidth() - minAbstandAchseJPanel), (int)(this.getSize().getHeight() - abstandGitterRand)); // Zeichnen der x-Achse
    
    
     // Beschriften der Achsen
     FontMetrics fm = g.getFontMetrics();
    
     //X-Achse
     g.drawString(beschriftungXAchse, (int)((this.getSize().getWidth() - abstandGitterRand - minAbstandAchseJPanel) / 2 + abstandGitterRand - fm.stringWidth(beschriftungXAchse) / 2), (int)(this.getSize().getHeight()-abstandBeschriftungXAchse));
     //Y-Achse
    

  AffineTransform at = AffineTransform.getRotateInstance(Math.toRadians(-90), 200,200);
//  Graphics2D g2d = (Graphics2D) getGraphics();
  g2d.setTransform(at);
  g.drawString("www.tutorials.de", 200,200);
    
   }
  
   public void zeichnenPunkte(Graphics g)
   {
     // Ermitteln der Abstaende zwischen zwei aufeinanderfolgenden X-Werten der Punkte
     abstandWerteXAchse = (((int)this.getSize().getWidth() - abstandGitterRand - minAbstandAchseJPanel) - ((int)this.getSize().getWidth() - abstandGitterRand - minAbstandAchseJPanel) % yWerte.length) / yWerte.length;
    
     // Bestimmung von Y-Max
     for(int i = 0; i < yWerte.length; i++)
     {
       if (yWerte[i] > yMax)
       {
         yMax = yWerte[i];
       }
     }
    
     // Ermitteln der Abstaende zwischen zwei aufeinanderfolgenden Y-Werten der Punkte
     abstandWerteYAchse = (((int)this.getSize().getHeight() - abstandGitterRand - minAbstandAchseJPanel) - ((int)this.getSize().getHeight() - abstandGitterRand - minAbstandAchseJPanel) % yMax) / yMax;
    
     // Zeichnen der Punkte
     for (int i = 0; i < yWerte.length; i++)
     {
       g.drawOval(abstandGitterRand + (i * abstandWerteXAchse) - 1, (int)(minAbstandAchseJPanel + (yMax - yWerte[i]) * abstandWerteYAchse) - 1, 2, 2); // Die Kreise haben einen Durchmesser von 2 Pixeln. Um sie genau auf dem Punkt zu zeichnen, muss von deren x- und y-Position jeweils 1 Pixel abgezogen werden!
     }
   }
  
}

Was mir bei diesem Code auch auffiel: die neuen Koordinaten scheinen nicht mehr auf das JPanel bezogen zu sein. Bei g2d.drawString("",0,0) verschwindet das gedrehte Bild aus dem JPanel.

Ein zweites Problem, welches ich nicht gelöst bekomme ist, dass ich den Hintergrund des JPanels gerne weiß hätte. Der Aufruf von
Java:
this.setBackground(Color.WHITE);
im Konstruktor der Klasse Inhalt löst das Problem nicht.

Wäre nett, wenn mir jemand helfen könnte.

Viele Grüße,
schiese
 
Zuletzt bearbeitet von einem Moderator:
Hallo,

ich versteh nicht ganz was die URL bei dem setBackground soll, aber mit dem setBackground(new Color(r, g, b))
lässt sich der weiße (oder andersfarbige) Hintergrund leicht realisieren.

In Bezug auf den senkrechten Text ist wichtig, dass das Bild zunächst gezeichnet wird und dann rotiert. Dementsprechend musst du die Startkoordinaten so wählen, dass das Ergebnis an den Koordinaten auftaucht, die du möchtest.
Dabei gilt:
x,y = Startkoord.
x', y' = Zielkoord.
a = Drehwinkel

x = x' cos(a) - y' sin(a)
y = x' sin(a) + y' cos(a)


Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class FarbePanel extends JFrame {

    public class MyDraw extends JPanel {
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2d = (Graphics2D) g;

            g2d.drawString("aString", 100, 100);
            g2d.rotate(0.5 * Math.PI);
            g2d.drawString("rString", 100, -100);
            g2d.rotate(-0.5 * Math.PI);
        }
    }

    public FarbePanel() {
        MyDraw p = new MyDraw();

        p.setBackground(new Color(255, 255, 255));

        this.setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setContentPane(p);
    }

    public static void main(String[] args) {
        (new FarbePanel()).setVisible(true);
    }

}
 

Neue Beiträge

Zurück