# Graphics: Per drawString() Text vertikal zentriert zeichnen



## m@nu (22. Jul 2005)

bin langsam am verzweifeln

wie kann ich einen text vertikal zentriert in einem bereich zeichnen?
ich benutze bereits die FontMetrics-Klasse etc., doch leider komm ich auf keinen grünen zweig bei der berechnung des entsprechenden y-offset-punktes.

hab mir den source des TitledBorder's mal angesehen... naja, so kompliziert brauch ich's auch wieder nicht.
hat jemand eine lösung griffbereit?

danke & gruss
m@nu


----------



## MPW (24. Jul 2005)

Worin zentrieren, in einem Label, einem TextField, einer Textarea...mal ein bisschen genauer...ein bisschen mehr Mühe beim Posten geben bitte - Danke!


----------



## lin (24. Jul 2005)

vielleicht so...

```
Font f = new Font("Monospaced", Font.PLAIN, 10);
FontMetrics fm = getFontMetrics(f);
int y = 0.5*(bereich.height - fm.getHeight());
```

versteh aber auch net recht, was du meinst... :?


----------



## sir_miller (24. Jul 2005)

hallo, ich glaube der GlyphVector kann dir helfen.
Hier ein Beispiel aus meinem Programm:

{
					FontRenderContext frc = g.getFontRenderContext();
					Font f = new Font("Sans Serif", 0, 12);
					GlyphVector gv = f // der GV bekommt eine Schrift zugewiesen
							.createGlyphVector(frc, peChild.getName());
					float a = (float) gv.getLogicalBounds().getWidth(); // ermitteln Länge des String
					g.drawGlyphVector(gv, x - a / 2, y + 35); Setzen und a/2 ergibt mittig
				}


----------



## m@nu (25. Jul 2005)

@MPW: hehe ... "zeichnen" impliziert für mich eigentlich dass ich das ganze per _Graphics_-instanz (von mir aus auch _Graphics2D_) machen möchte...
wie ich das in einem JLabel machen muss, is mir auch klar...
aber hast' ja recht  hab den post-titel mal ein wenig klarer gestaltet 

@lin: ne, das funktioniert eben leider nicht... die _drawString_-methode benutzt nicht "oben-links" als 0/0-punkt... er verwendet irgend einen anderen, schrift-spezifischen, punkt als 0/0 (denk ich mal)

@sir_miller: ne, funktioniert für vertikales zentrieren leider auch nicht...  trotzdem danke für die anregung! 


hier meine beiden implementierungen bis anhin:

```
// by sir_miller:
            FontRenderContext frc = g2.getFontRenderContext();  
            GlyphVector gv = textFont // der GV bekommt eine Schrift zugewiesen 
            .createGlyphVector(frc, getText());  
            float y = (float)gv.getLogicalBounds().getHeight();
            g2.setColor(Color.black);
            g2.drawGlyphVector(gv, 10, y/2); // Setzen und a/2 ergibt mittig
```


```
// by m@nu
            g2.setFont(this.textFont);
            g2.setColor(Color.black);
            
            int y = halfHeight - (textHeight/2);
            g2.drawString(text, 10, y+3);
```

in meiner version habe ich das ganze einfach per "+3" gefixt... aber wies bei einer anderen schrift aussieht, habe ich keine ahnung :?


ps. mit folgendem code ermittle ich die zeilenhöhe:

```
/* Zeilenhöhe: */
            FontMetrics metrics = getFontMetrics(textFont);
            int lineHeight = metrics.getHeight();
            
            /* Speichern: */
            this.textHeight = lineHeight;
```


----------



## m@nu (25. Jul 2005)

soooo... hab nochmal das offizielle java-forum von sun abgegrast, und eine lösung für das problem gefunden...

here it is:

```
// Titel zeichnen: 
            g2.setColor(Color.black);
            TextLayout textLayout = new TextLayout(text,textFont, g2.getFontRenderContext());
            Rectangle2D bounds = textLayout.getBounds();
            int x = 8;
            int y = (int)((getHeight() - bounds.getHeight())/2-bounds.getY());
            textLayout.draw(g2, x, y);
```


----------

