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