JavaFX Gedrehter Text auf Canvas (Positionierung)

hk

Bekanntes Mitglied
Hallo Forum,
ich möchte auf einer Canvas einen Text ausgeben, der um einen Winkel gedreht ist. Das funktioniert auch, nur die Position des Textes ist weder ohne oder mit Zentrierung dort wo sie sein soll. Kann mir jemand sagen wie ich den Text auf die gewünschte Position bringen kann?
Folgender Code ist lauffähig.
Java:
package text45grad;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

/**
 * Ein Text wird auf einer Canvas über einem Winkel gedreht und
 * auf einem Mittelpunkt zentriert
 * @author User
 */
public class Text45Grad extends Application {
 
  Canvas canvas;
  double angle = -45d;
  double x = 300;
  double y = 200;
  double textWidth;
  @Override
  public void start(Stage primaryStage) {
    canvas = new Canvas(600, 600);
    GraphicsContext gc = canvas.getGraphicsContext2D();
    // Testlinie zeichnen
    gc.beginPath();
    gc.moveTo(300, 0);
    gc.lineTo(300, 599);
    gc.moveTo(290, 200);
    gc.lineTo(310, 200);
    gc.stroke();
    // Canvas wird gesichert und dann mittels 'angle' gedreht
    gc.save();
    Rotate r = new Rotate(angle, canvas.getWidth() / 2, canvas.getHeight() / 2);
    gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy());
    // Textlänge in Pixel holen
    String tx = "Das ist ein gedrehter Text!";
    Text text = new Text(tx);
//    text.setFont(dc.fx_help.getFont()); // gewünschter Font
    textWidth = text.getLayoutBounds().getWidth();
    double diff = x- y;
    // Text nun normal ausgeben
//    gc.fillText(tx, x, y);
    gc.fillText(tx, x - textWidth / 2 , y );
    // Canvas wird zurückgedreht
    gc.restore();
    
    StackPane root = new StackPane();
    root.getChildren().add(canvas);
    
    Scene scene = new Scene(root, 600, 600);
    
    primaryStage.setTitle("Text gedreht ausgeben");
    primaryStage.setScene(scene);
    primaryStage.show();
  }

  /**
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    launch(args);
  }
 
}
 
Y

yfons123

Gast
du verschiebst deinen text um die hälfte der width nach rechts
dann um die hälfte der width nach unten da der dreh punkt des textes halt nunmal links ist und nicht in der mitte

also musst du den linken punkt so verschieben dass es rotiert wäre als wie wenn es um den mittelpunkt rotiert wäre
 

hk

Bekanntes Mitglied
du verschiebst deinen text um die hälfte der width nach rechts
dann um die hälfte der width nach unten da der dreh punkt des textes halt nunmal links ist und nicht in der mitte

also musst du den linken punkt so verschieben dass es rotiert wäre als wie wenn es um den mittelpunkt rotiert wäre
das klingt logisch, funktioniert aber nicht (siehe neuer Code). Wenn wie du sagst die Drehachse links (also bei x=300, y=200) ist dann dürfte sich diese Position nicht verändern sondern nur der Rest des Textes. Dem ist aber nicht so. Das sieht man, wenn man den Text ohne Zentrierung ausgibt, auch dann ist er verschoben (Tausche <- mit Zentrierung gegen <- ohne Zentrierung).
Java:
package text45grad;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.scene.transform.Rotate;
import javafx.stage.Stage;

/**
 * Ein Text wird auf einer Canvas über einem Winkel gedreht und
 * auf einem Mittelpunkt zentriert
 * @author User
 */
public class Text45Grad extends Application {
 
  Canvas canvas;
  double angle = -45d;
  double x = 300;
  double y = 200;
  double textWidth;
  @Override
  public void start(Stage primaryStage) {
    canvas = new Canvas(600, 600);
    GraphicsContext gc = canvas.getGraphicsContext2D();
    // Testlinie zeichnen
    gc.beginPath();
    gc.moveTo(300, 0);
    gc.lineTo(300, 599);
    gc.moveTo(290, 200);
    gc.lineTo(310, 200);
    gc.stroke();
    
    // Canvas wird gesichert und dann mittels 'angle' gedreht
    gc.save();
    Rotate r = new Rotate(angle, canvas.getWidth() / 2, canvas.getHeight() / 2);
    gc.setTransform(r.getMxx(), r.getMyx(), r.getMxy(), r.getMyy(), r.getTx(), r.getTy());
    // Textlänge in Pixel holen
    String tx = "Das ist ein gedrehter Text!";
    Text text = new Text(tx);
//    text.setFont(dc.fx_help.getFont()); // gewünschter Font
    textWidth = text.getLayoutBounds().getWidth();
    // Text nun normal ausgeben
//    gc.fillText(tx, x, y);                                // <- ohne Zentrierung
    gc.fillText(tx, x + textWidth / 2 , y + textWidth / 2); // <- mit Zentrierung
    // Canvas wird zurückgedreht
    gc.restore();
    
    StackPane root = new StackPane();
    root.getChildren().add(canvas);
    
    Scene scene = new Scene(root, 600, 600);
    
    primaryStage.setTitle("Text gedreht ausgeben");
    primaryStage.setScene(scene);
    primaryStage.show();
  }

  /**
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    launch(args);
  }
 
}
 

Neumi5694

Top Contributor
Der Einfügepunkt eines Texts liegt links oberhalb des Texts, du wirst dessen Shape also erst mal um die Differenz zum gewünschten Drehpunkt verschieben müssen.
Nach der Drehung kannst du immer noch zurückschieben.
 

hk

Bekanntes Mitglied
Ich habe es nun geschafft. Der Text wird in jedem Winkel korrekt angezeigt (die Zentrierung habe ich noch nicht berücksichtigt).
Hier der lauffähige Code:
Java:
package text45grad;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Text;
import javafx.stage.Stage;

/**
 * Ein Text wird auf einer Canvas über einem Winkel gedreht und
 * auf einem Mittelpunkt zentriert
 * @author User
 */
public class Text45Grad extends Application {
 
  Canvas canvas;
  double angle = 225d;
  double x = 300;
  double y = 200;
  double textWidth;
  String tx = "Das ist ein gedrehter Text!";

  @Override
  public void start(Stage primaryStage) {
    canvas = new Canvas(600, 600);
    GraphicsContext gc = canvas.getGraphicsContext2D();
    // Testlinie zeichnen
    gc.beginPath();
    gc.moveTo(300, 0);
    gc.lineTo(300, 599);
    gc.moveTo(290, 200);
    gc.lineTo(310, 200);
    gc.stroke();
    
    drawAngledText(x, y, tx, angle, gc);
    
    StackPane root = new StackPane();
    root.getChildren().add(canvas);
    Scene scene = new Scene(root, 600, 600);
    primaryStage.setTitle("Text gedreht ausgeben");
    primaryStage.setScene(scene);
    primaryStage.show();
  }

  /***************************************************
   * Ein Text wird in einem definierten Winkel auf dem
   * GraphicsContext angezeigt.
   * @param x     = X-Position der Anzeige
   * @param y     = Y-Position der Anzeige
   * @param text  = Anzuzeigender Text
   * @param angle = Textwinkel
   * @param gc    = GraphicsContext
   */
  public static void drawAngledText(double x, double y, String text,
          double angle, GraphicsContext gc) {
    // Wenn der Winkel größer 90° und kleiner 270° ist wird
    // die Text-Startpositin umgedreht. Sie liegt nun dort
    // wo das Textend gewesen wäre.
    if(angle > 90 && angle < 270) {
      Text tx = new Text(text);
      double textWidth = tx.getLayoutBounds().getWidth();
      // Anhand der Textlänge wird die Positionsänderung
      // in x/y Richtung errechnet.
      x += textWidth * Math.cos(Math.PI/180*angle);
      y += textWidth * Math.sin(Math.PI/180*angle);
      // Der ursprüngliche Winkel wird um 180° gedreht.
      angle += 180;
    }
    // Rotation und Anzeige durchführen
    gc.save();
    gc.translate(x, y);
    gc.rotate(angle);
    gc.fillText(text, 0, 0);
    gc.restore();
  } //end drawAngledText *********************************
 
  /**
   * @param args the command line arguments
   */
  public static void main(String[] args) {
    launch(args);
  }
}
PS: Wenn es jemand besser kann, sehe ich mir das gerne an,
lg heinz
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
C JToggleButton disabled Text Color AWT, Swing, JavaFX & SWT 11
H JavaFX Label.Text mit bind an DoubleProperty binden AWT, Swing, JavaFX & SWT 3
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
FrittenFritze Text in Flying Saucer selectierbar machen AWT, Swing, JavaFX & SWT 0
Mojo7310 Ändern von Text in JLabel mit einem Button AWT, Swing, JavaFX & SWT 11
raeuchertofu Text von JTextfield und JLabel ändern AWT, Swing, JavaFX & SWT 2
F Best-Practise: JTable Text in Zelle zu groß AWT, Swing, JavaFX & SWT 2
I Rich Text drucken AWT, Swing, JavaFX & SWT 0
B Text mit Absatz + OK-Button, der Fenster wieder schließt AWT, Swing, JavaFX & SWT 7
R Text vom Jlabel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
N Promt Text der Combobox AWT, Swing, JavaFX & SWT 0
M JavaFX javaFX Label-Text wird nicht gesetzt AWT, Swing, JavaFX & SWT 3
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
N In Textdatei Text anfügen per GUI AWT, Swing, JavaFX & SWT 3
N Textdatei GUI, Text in Textarea anzeigen mehrere Zeilen AWT, Swing, JavaFX & SWT 1
R Swing JTextField nicht-kopierbarer Text AWT, Swing, JavaFX & SWT 1
S Text-Info in der Taskbar anzeigen AWT, Swing, JavaFX & SWT 15
E Warum wird Text im JTextArea erst am Programmende angezeigt ? AWT, Swing, JavaFX & SWT 1
S Swing JLabel Text mit der Zeit ändern AWT, Swing, JavaFX & SWT 1
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
C JCheckBox disabled text color AWT, Swing, JavaFX & SWT 9
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
CptK Swing Button: ImageIcon unter den Text AWT, Swing, JavaFX & SWT 4
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
L JavaFX TableView kein content text ändern AWT, Swing, JavaFX & SWT 2
L JavaFX Anderer Text, wenn kein Platz ist. AWT, Swing, JavaFX & SWT 1
K JavaFX TextInputDialog Button Text ändern AWT, Swing, JavaFX & SWT 1
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
B JavaFX Text wird nicht angezeigt, kein Fehler AWT, Swing, JavaFX & SWT 2
J Text in ein Textfeld eingeben und speichern AWT, Swing, JavaFX & SWT 27
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
C Swing Spinner als TableCellEditor - Text zu klein AWT, Swing, JavaFX & SWT 2
H JavaFX - Button und Text - Falsche Darstellung AWT, Swing, JavaFX & SWT 3
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
zhermann FX Label text wird nicht richtig angezeigt AWT, Swing, JavaFX & SWT 12
I JavaFX formatierter Text in PDF speichern AWT, Swing, JavaFX & SWT 4
T JavaFX Text des ProgressIndicators ändern AWT, Swing, JavaFX & SWT 2
E Swing Text verschwindet AWT, Swing, JavaFX & SWT 1
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
G Rectangle Breite richtet such an die Breite vom Text AWT, Swing, JavaFX & SWT 1
Sanni94 JavaFX Kann man eine Grafik in einen Text einbinden? AWT, Swing, JavaFX & SWT 2
S JTextArea Text nach oben wandern lassen AWT, Swing, JavaFX & SWT 7
F Icons neben Text in Listview setzen AWT, Swing, JavaFX & SWT 2
K Rich Text FX von TomasMikula AWT, Swing, JavaFX & SWT 0
M Text in einem Label fett setzen AWT, Swing, JavaFX & SWT 4
S JAVAFX HTMLEditor wrap text AWT, Swing, JavaFX & SWT 1
J JavaFX Translation Text/Label AWT, Swing, JavaFX & SWT 2
K Swing JTable mit ImageIcon und Text in einer Zelle AWT, Swing, JavaFX & SWT 1
A JavaFX HTMLEditor in Text umwandeln AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
J JavaFX Bestimmte Zellen im TableView ändern (Farbe und Text) AWT, Swing, JavaFX & SWT 1
2 JLabel - setText ändert den Text nicht AWT, Swing, JavaFX & SWT 4
B Jlabel Text von anderen Klasse aus ändern AWT, Swing, JavaFX & SWT 9
stylegangsta JLabel anzuzeigenden Text zentrieren AWT, Swing, JavaFX & SWT 9
javampir Java FX Text verschwindet nicht AWT, Swing, JavaFX & SWT 9
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
Tom299 JavaFX Text oder Label benutzen AWT, Swing, JavaFX & SWT 4
E To get a color text on the TextArea AWT, Swing, JavaFX & SWT 4
E To get color text on the TextArea AWT, Swing, JavaFX & SWT 5
M Swing JTextPane, Bilder und Text-flow AWT, Swing, JavaFX & SWT 2
Z AWT JLabel setzt kein neuen Text AWT, Swing, JavaFX & SWT 6
D Event Handling Aus einer anderen Klasse heraus einen Text des JLabels ändern. AWT, Swing, JavaFX & SWT 12
T JavaFX Editable Combobox Text-Selektierung nach Trigger AWT, Swing, JavaFX & SWT 4
S JLabel-Text in Methode setzen? AWT, Swing, JavaFX & SWT 2
F JPanel "zeichnet" keinen Text AWT, Swing, JavaFX & SWT 14
U WYSIWYG Text-Editor für JFrames AWT, Swing, JavaFX & SWT 8
C Button Text in JList neue Zeile AWT, Swing, JavaFX & SWT 6
T MausClick soll TExt ändern AWT, Swing, JavaFX & SWT 6
J Text bei Eingabe löschen AWT, Swing, JavaFX & SWT 5
A SWT Auto completion in text box AWT, Swing, JavaFX & SWT 5
C Geloest: JTextfield: Titel automatisch entfernen, sobald Text eingegeben wird AWT, Swing, JavaFX & SWT 1
I Text zur Linie zeichnen AWT, Swing, JavaFX & SWT 1
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
X AWT Text der mit Graphics "drawString(...)" geschreiben wurde wieder löschen. AWT, Swing, JavaFX & SWT 6
O Swing Text aus Textfield auslesen AWT, Swing, JavaFX & SWT 8
B Text auf Display ausgeben [LWJGL] AWT, Swing, JavaFX & SWT 2
G Text im textfeld in einem Editor anzeigen AWT, Swing, JavaFX & SWT 18
S TextArea get Selected row(Text) AWT, Swing, JavaFX & SWT 6
A Radio Buttons sollen den Text der text Area bestimmen AWT, Swing, JavaFX & SWT 9
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
J LayoutManager Text Spielerein GUI AWT, Swing, JavaFX & SWT 2
H Javafx - Styled Text AWT, Swing, JavaFX & SWT 5
M Text Area 1. Zeile oben AWT, Swing, JavaFX & SWT 4
A Swing Focus der Radio Buttons + text bleibt gleich und gleichzeitige ausgabe zweier Objekte in 1. Fenster AWT, Swing, JavaFX & SWT 3
R JavaFX Automatischer Zeilenumbruch in Text AWT, Swing, JavaFX & SWT 13
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
F Dialog mit Titel, Text und Ok Button AWT, Swing, JavaFX & SWT 2
T Swing HTML Text aus JLabel ohne "HTML-Tags" in String einlesen AWT, Swing, JavaFX & SWT 5
TheJavaKid DocumentListener soll Text in JTextField ändern AWT, Swing, JavaFX & SWT 4
K JEditorPane Text einfügen AWT, Swing, JavaFX & SWT 4
A Text (String) zu einer Box hinzufügen AWT, Swing, JavaFX & SWT 16
B SWT Text - zeilenumbruch AWT, Swing, JavaFX & SWT 2
TheWhiteShadow Swing Document Text Position in Pixel AWT, Swing, JavaFX & SWT 2
J Swing Text kürzendes JLabel AWT, Swing, JavaFX & SWT 12
J Swing TextArea mit nicht-editierbarem Text AWT, Swing, JavaFX & SWT 7
P Text in JPanel hinzufügen AWT, Swing, JavaFX & SWT 2
J Button soll nach Klick Text ändern und Programm in 3 Sekunden beenden AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben