getFontMetrics außerhalb von paint(Graphics g)

Status
Nicht offen für weitere Antworten.

javanewcomer

Mitglied
Hi!
Gibt es eine Möglichkeit getFontMetrics außerhalb von paint(Graphics g) aufzurufen?
So funktioniert es:
[HIGHLIGHT="Java"]import java.awt.*;

public class Test
extends Frame
{
public static void main(String[] args)
{
Test wnd = new Test();
}
public Test()
{
super("Test");
setSize(300,200);
setVisible(true);
}
public void paint(Graphics g)
{
Font font;
FontMetrics fm = getFontMetrics(new Font("Serif",Font.PLAIN,36));
System.out.println(fm.getAscent());
}
}[/HIGHLIGHT]
Aber so funktioniert es eben nicht:
[HIGHLIGHT="Java"]import java.awt.*;

public class Test
{
public static void main(String[] args)
{
Font font = new Font("Serif",Font.PLAIN,36);
FontMetrics fm = getFontMetrics(font);
System.out.println(fm.getAscent());
}
}[/HIGHLIGHT]
Im 2. Beispiel heißt es, dass die Methode undefiniert ist.

Aber wie komme ich ohne die paint-Methode aufrufen zu müssen an die Daten heran und vor allem weshalb ist die Methode undefiniert?

mfg
javanewcomer
 
Beispiel 1 ist in einem nicht-statischen Kontext
Beispiel 2 ist in einem statischen Kontext
Außerdem erbt deine Klasse von Frame

Nur Beispiel 1 kann getFontMetrics aufrufen, da getFontMetrics nicht-statisch ist

(Die Methode getFontMetrics ist in Component definiert worden, Container erbt es, Window erbt es aus Container, Frame erbt es aus Window und du erbst es aus Frame)
 
Du kannst über das Toolkit gehen, ist aber deprecated und wenn die Rendering Hints nicht zum Graphics Context deiner Component passen sind die Ergebnisse natürlich falsch.
 
Hi!
Okay danke erstmal!
Werde es nochmal über Toolkit versuchen.

Aber auch wenn ich das 2. Beispiel um "extends Frame" erweitere funktioniert es nicht, aber soweit ich Schandros Antwort verstanden habe, müsste es doch dann funktionieren oder habe ich etwas übersehen bzw. falsch verstanden?

mfg
javanewcomer
 
von den drei Sätzen
Beispiel 1 ist in einem nicht-statischen Kontext
Beispiel 2 ist in einem statischen Kontext
Außerdem erbt deine Klasse von Frame
hast du den dritten bedacht, die ersten beiden anscheinend ignoriert, oder nicht verstanden,
woraus eine Schlussfolgerung 'müsste es doch dann funktionieren' dann allerdings kühn wäre

1/3 Treffer, etwas knapp 😉
 
nein ist immer noch in einem statischen Kontext "static main"...

Was ist eigentlich dein Ziel?

Gibt es eine Möglichkeit getFontMetrics außerhalb von paint(Graphics g) aufzurufen?

Ja du kannst die Zeilen wo du in paint hast genau so gut im Konstruktor aufrufen... ist ja nicht von paint abhängig...
 
Zuletzt bearbeitet von einem Moderator:
Oder du legst dir eine Kopie von deiner Component an und holst es via getFontMetrics zurück 😉 (oder gleich direkt vom Objekt).
 
man kann die Metrics direkt von dem Font bekommen:

Code:
Font font = ...;
String text = "Text";

FontRenderContext frc = new FontRenderContext(null, true, false);

LineMetrics lm = font.getLineMetrics(text, frc);

Rectangle2D bound = font.getStringBounds(text, frc);

dazu sollte man sich aber vorher FontRenderContext ansehen, da kann man eine Menge Sachen setzen.

Slawa
 
Hi!
Achso, ich hatte das mit dem statischen Kontext falsch verstanden! Die Methode, welche getFontMetrics aufruft darf also nicht statisch sein. Nun ist es angekommen😉

Hab es jetzt so gelöst und es erfüllt erstmal seinen Zweck. Falls doch nicht werde ich eure anderen Tips noch aufgreifen.

Danke an alle!!!

[HIGHLIGHT="Java"]import java.awt.*;

public class Test
{
public static void main(String[] args)
{
Ascent data = new Ascent();
data.printAscent();
}
}

class Ascent
extends Frame
{
public void printAscent()
{
Font font = new Font("Serif",Font.PLAIN,36);
FontMetrics fm = getFontMetrics(font);
System.out.println(fm.getAscent());
}
}[/HIGHLIGHT]

mfg
blut-lecker
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben