Erste string-Größe in java (ohne ein Graphics-Objekt zur Verfügung)
Ich bin versucht, zu schreiben Anwendung, die zeichnen müssen viele strings mit Graphics2D-Klasse in Java. Ich brauche, um die Größen der einzelnen String-Objekt (um die exakte position eines jeden string).
Es gibt so viele Stränge, dass es getan werden sollte, bevor die paint () - Methode aufgerufen wird und auch nur einmal am Anfang von meinem Programm (also dann habe ich nicht Graphics2D-Objekt noch). Ich weiß, dass es eine Methode Font.getStringBounds (), aber es braucht eine FontRenderContext-Objekt als parameter.
Als ich versuchte, meine eigenen erstellen-Objekt:
FontRenderContext frc = new FontRenderContext(MyFont.getTransform(), true, true)
dann erhalten die Saiten Grenzen habe ich immer verschiedene Größen, als wenn ich erhalten FontRenderContext mit Graphics2D.getFontRenderContext () - Methode innerhalb der paint () - Methode. Die Unterschiede sind nicht gross (etwa 1E-3) aber ich Frage mich, warum es da Unterschiede gibt?
Jedoch, gibt es eine bessere und sichere Weg, um Größen von einem string?
Thnx für jede Hilfe im Voraus!
InformationsquelleAutor Lukasz Spas | 2011-02-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen mit der FontMetrics Klasse; die stringWidth Methode gibt die Größe einer Zeichenkette.
Ein Beispiel:
InformationsquelleAutor Alberto
Vielleicht wollen Sie auch heraus zu überprüfen
SwingUtilities.computeStringWidth
.InformationsquelleAutor Jochen Bedersdorfer
Nev-ah. Gonna. Passieren.
Der Grund ist, das rendering und die Berechnung, die Sie suchen aus FRC-spezifisch ist, um ein Graphics-Kontext, D. H. eine bestimmte Graphics2D-Objekt. Die eine, die Sie interessiert, ist Sie übergeben, die zur Laufzeit - es ist wie keine andere (Sie müssen davon ausgehen).
Können Sie berechnen, wie viel Sie wollen mit einer FRC von einigen anderen Graphics2D, aber Ihre Berechnungen alle-alles für die Katz, wenn Sie versuchen, verwenden Sie zur Laufzeit mit der Graphics2D paintComponent übergeben wird, die die Graphics2D du gehst zu verwenden, egal was.
So, ja, das wäre schön, aber es ist völlig theoretisch. All das schöne Informationen effektiv weggesperrt innen, FRC, denn ohne die genaue Graphics2D den AttributedString tatsächlich gezeichnet, dass die FRC ist schlimmer als nutzlos - es ist eine illusion man könnte tatsächlich versuchen, Sie zu umarmen.
Macht es Sinn, da alles, was wirklich ist, IST abhängig von der Graphics2D Sie übergeben zur Laufzeit. Also das beste, was zu tun ist, akzeptieren es, und schreiben Sie Ihren code, um innerhalb von paintComponent aus, was Objekte und was auch immer spezielle Berechnung, die Sie tun, und bauen Sie Ihr design, um die Tatsache, dass DIES ist, wie die Dinge sind.
Ich ist eine gute Frage und eine gute Sache, die du wünschen könntest, nur, Sie können es nicht. Sehen Sie andere Menschen Fragen, für das an anderer Stelle im Internet, in anderen Foren. Beachten Sie das fehlen von nützlichen Antworten und /oder ohrenbetäubende Stille.
InformationsquelleAutor Swing God
Hier ist ein code-snippet, das macht etwas ähnliches -- schrieb es für die Abkürzung der string auf die angegebene Anzahl von Pixeln.
Naja.. die Eigenschaften von Graphics2D-Instanz unterschiedlich sein können über die Lebensdauer der Anwendung. Wie Sie hingewiesen haben, durchaus richtig, man braucht, zu berücksichtigen, "anti-aliasing-und anderen Funktionen", die nicht möglich ist ohne eine bestimmte Instanz von Graphics2D.
InformationsquelleAutor 01es
Neben der Verwendung von FontMetrics, ein JLabel kann verwendet werden, um zu bestimmen, die Größe der beiden unformatiert und (basic HTML) gerendert text. Hier ist ein Beispiel.
Edit 1:
"Viele Saiten" - Kommentar. Malen Sie die Zeichenfolgen in ein BufferedImage wird nur neu generiert, wenn nötig. Verwenden Sie die BufferedImage-jeder Zeit paintComponent() aufgerufen wird.
InformationsquelleAutor Andrew Thompson
aus historischen Gründen,hier ist, wie ich glaube, er hat es ursprünglich (jruby java pseucodoe)
InformationsquelleAutor rogerdpack