AffineTransformation und FontMetrics

Status
Nicht offen für weitere Antworten.

boesi

Aktives Mitglied
Hallo

Ich benutze java.awt.print.* um Druckausgaben zu erzeugen - funktioniert wunderbar ... fast
Ich nutze Graphics2D.getFontMetrics() um Text auszurichen - funktioniert auch ... fast

Wenn ich einen Font mit Font.deriveFont(AffineTransform.getRotateInstance(-Math.PI/2.0)) um 90° drehe, mit Graphics2D.setFont(...) setze und mir dann das FontMetrics-Objekt hole, sind in diesem Objekt alle relevanten Werte 0.0 und entsprechend liefern getHeight(), stringWidth() usw ebenfalls 0.

Bleibt also die Frage: Wie bekomme ich von einem transformierten Font die Metriken?


Es ist übrigens egal, ob es sich um die eingebauten Fonts oder separate TrueType-Fonts handelt.


Vielen Dank für eure zahlreichen Hinweise ;)
cu boesi
 

boesi

Aktives Mitglied
Mit einem Stück Code dazu kann man Dir sicher helfen... :)
Mist ich wusste dass sowas kommt ;) Hatte die Hoffnung, dass jemand weiß - ja wenn du son Quatsch machst, dann mußte die Metriken über den FontRendererContext initialieren ... oder sowas in der Art ...

Ok dann hier erstmal der Code, wie ich im Prinzip den Font setze. Über's WE versuche ich das noch mal in ein lauffähiges Programm einzubinden.
Code:
...
Font font = new Font("SansSerif", Font.PLAIN, 16);
font =  font.deriveFont(AffineTransform.getRotateInstance(-Math.PI/2.0));
g2d.setFont(font);
FontMetrics metric = g2d.getFontMetrics();
int heightStr = metric.getHeight()-metric.getLeading();
// jetzt ist heightStr = 0
...
 

Ebenius

Top Contributor
Warum das so nicht geht weiß ich nicht. Transformierte Fonts scheinen auch in Swing-Komponenten nicht sauber zu funktionieren (JButton hat auch das Problem, dass die Größe nicht stimmt, etc).

Ansatz 1: Woher kommt denn der transformierte Font. Kannst Du nicht statt den Font zu transformieren einfach die Graphics-Instanz transformieren?

Ansatz 2: Du kannst Dir auch die die Metriken des nicht transformierten Fonts holen und die extrahierten Werte dann transformieren. In etwa sowas: [Highlight=Java]final AffineTransform fontTransform = font.getTransform();
final Font untransformedFont = font.deriveFont(new AffineTransform());
final FontMetrics fontMetrics = g.getFontMetrics(untransformedFont);
final Rectangle2D bounds =
fontMetrics.getStringBounds("Hallo", 0, 4, g);
final Shape transformedBounds =
fontTransform.createTransformedShape(bounds);[/Highlight]
Ebenius
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben