# getFontMetrics() außerhalb des Components



## conan2 (3. Okt 2006)

Bei einem Programm muss ich in mehreren Klassen wissen, wie breit ein am Bildschirm anzuzeigender Text ist,
dabei bleibt der Font immer gleich. Nun will ich die Funktion natürlich nicht in jeder Klasse neu definieren sondern
will mir dazu eine Tools-Klasse mit statischen Methoden schreiben. Ich versuchte also sowas wie

```
public static void getStringWidth(String s){
    FontMetrics fm = getFontMetrics(new Font("Times New Roman", Font.PLAIN, 10));
    return fm.stringWidth(s);
}
```
Natürlich bekam ich sofort eine Fehlermeldung dass die Methode getFontMetrics() nicht existent ist und bin 
draufgekommen dass sie nur in der Klasse Component existiert. In der Toolkit-Klasse gibt es die Methode auch, 
allerdings ist sie dort deprecated. Danach bin ich noch auf die getLineMetrics()-Methode aufmerksam geworden aber in 
der LineMetrics-Klasse konnte ich keine getWidth()-Methode oder was Ähnliches finden. Weiß da jemand einen Ausweg?


----------



## thE_29 (3. Okt 2006)

Graphics.getFontMetrics(); gibts noch!

Einfach die paint Methode überschreiben und dort zuweisen!


----------



## Guest (3. Okt 2006)

Genau hier liegt mein Problem!Wie schon gesagt benötige ich die getFontMetrics()-Methode in einer Tools-Klasse
und in der gibt's keine paint()-Methode, die ich überschreiben könnte.


----------



## thE_29 (3. Okt 2006)

Dann nimms Toolkit und scheiss auf das deprecated...

LineMetrics ist net mal ein annehmbarer Ersatz!


Oder ein dirty Trick ist



```
public interface IFontMetricsSetter
  {
    public void setFontMetrics(FontMetrics metrics);
  }
```
 

```
public void setFontMentrics(final Font font, final IFontMetricsSetter setter)
  {
    JFrame f = new JFrame(){
      public void paint(Graphics g)
      {
        super.paint(g);
        if(g != null)
          setter.setFontMetrics(g.getFontMetrics(font));
      }
    };
    f.setUndecorated(true); //damit keine Titelleiste angezeigt wird!
    f.setLocation(-1000,-1000); //irgendwo außerhalb vom Bildschirm
    f.setVisible(true);
    f.setVisible(false);
  }
```

Du brauchst halt nen Zugang zur grafischen Oberfläche! Aber die braucht man schon, sobald man new Font sagt!


----------



## conan2 (3. Okt 2006)

Danke das hat mir jetzt weitergeholfen  
Ich habs einfach so gemacht: new Frame().getFontMetrics(...)
Oder ist das vielleicht ein Problem weil dann jedesmal wenn die Methode aufgerufen wird ein new Frame() erzeugt wird?


----------



## Wildcard (4. Okt 2006)

ohne das jetzt verifiziert zu haben würde ich behaupten das jeder neue Frame über einen eigenen GraphicContext verfügt und die Font-Metrics damit nicht identisch sind.


----------



## thE_29 (4. Okt 2006)

Naja, es würde ja auch new JButton().getFontMetrics, etc gehen, da es ja von java.awt.Component ist


----------



## conan2 (4. Okt 2006)

Hab mich dann für die deprecated-Methode vom Toolkit entschieden und zwar darum, weil ich glaub dass da den
Developern ein kleiner Fehler unterlaufen ist, denn in den javadocs steht bei der Toolkit.getFontMetrics()-Methode dabei
dass sie durch Font.getLineMetrics() ersetzt wurde, aber da das keinen Ersatz darstellt nehm sie einfach trotzdem...


----------

