以前にpaintComponentを呼び出さずにテキスト測定を行うにはどうすればよいですか?

こんにちは、 < code> java.awt.font.FontRenderContext ですが、このクラスではグラフィックスオブジェクトを指定する必要があります。

私が知っているから、私がグラフィックスオブジェクトをつかむ唯一の方法は、paintComponent/paintメソッドを使うことです:

@Override public void paintComponent(java.awt.Graphics g){ //...

しかし、私は paintComponent メソッドが呼び出される前でもこの測定を行う必要があります。私はこの問題に対する最良の解決策が何であるか疑問に思っていましたか?

私は仕事をするためにダミーのJLabelを作成しますか?

4
+1を使用する場合は FontMetrics ではなく FontRenderContext を使用します。 b)ドキュメントにリンクする。 c)v。7文書にリンクする。
追加された 著者 Andrew Thompson,
FontMetrics ですが、抽象です。それはいくつかの文脈で、例えば検査されなければならない。 Graphics2D コンテキスト内の FontRenderContext
追加された 著者 trashgod,
FontMetricsで何が問題ですか?
追加された 著者 Stephan,

5 答え

No need to create dummy GUI components. You could for instance create a BufferedImage

Graphics g = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB).getGraphics();
4
追加された
Btw私はこれが本当に「直接構築されたFontRenderContextは実際のグラフィックスデバイスをほとんど表さず、予期しない結果や誤った結果につながる可能性がある」と思っていました。 docs.oracle.com/javase/7/ docs/api/java/awt/font /&hellip; はしないように指示していますか?
追加された 著者 Pacerier,
@AndrewThompsonあなたは BufferedImage.TYPE_INT_RGB を使うべきですか?
追加された 著者 Pacerier,
@AndrewThompsonサイズは(0,0)なので例外がありました。私はそれを(1,1)に変更し、 TYPE_CUSTOM の例外がありました。 Btw TYPE_BYTE_BINARY はうまくいくようですが、RGB/GRAY/BINARYなどの違いがあるかどうかは分かりますか?
追加された 著者 Pacerier,
@ AndrewThompsonあなたは私がそれらのいずれかをすることができるという意味ですか? BufferedImage.TYPE_CUSTOM も同様です。
追加された 著者 Pacerier,
...次に、代わりのUIManagerフォントを取得するために使用した倍率をstringWidthフィギュア(「Hello World」)に適用しました:96ピクセル。いったん表示されると、実現された派生フォントを使用する真の数字は93ピ​​クセルです。特定の目的のための有用なガイドですが、OPが望んでいるものを提供しません。
追加された 著者 mike rodent,
私はこの答えによって少し困惑している。私は私のJFrameを見えるようにする前にそれを試してみましたが、グラフィックスは私の驚くべきことではなく、私にFontMetrics.stringWidth(...)の間違った答えを与えました。私は以前、UIManagerのすべてのフォントを少し大きめの派生バージョン用に交換していたことを明記します。しかし、私が期待したように、私が得た答えは、元のバージョンの真のピクセル幅の数値を与えました。あなたが正確なグラフィックスを得ることができるコンポーネントが表示されるときにのみ私は考える ...
追加された 著者 mike rodent,
find @Pacerierに基づいて答えを更新しました。
追加された 著者 aioobe,
ええ、それは私が心で知っていた唯一のものです;-)最も安いものを選んでください...
追加された 著者 aioobe,
しかし、それの前にある文章は、それがグラフィックスオブジェクトから取得されていればOKだと説明しています。 (なぜなら、FontRenderContextは薄い空気から作られていないからです... Graphicsオブジェクトによって注意深く構築されています)。
追加された 著者 aioobe,
BufferedImage.TYPE_CUSTOM <このタイプはgetType()メソッドの戻り値としてのみ使用されます。 " あなたが試した
追加された 著者 Andrew Thompson,
@Pacerierこれは私に答えてください。透明性をサポートするために、我々が作成しないBIの利点は何ですか?
追加された 著者 Andrew Thompson,
私は通常、 INT_RGB を使用します。この使用のために、残りのいずれかで十分であると思います。
追加された 著者 Andrew Thompson,
BufferedImage.TYPE_INT_ARGB なぜ(大文字) A ですか?それは不要です。
追加された 著者 Andrew Thompson,

しかし、paintComponentメソッドが呼び出される前でもこの測定を行う必要があります。

おそらく、コンポーネントのgetPreferredSize()メソッドをオーバーライドする必要があります。 Swingコンポーネントは、コンポーネントが表示される前にコンポーネントのサイズとレイアウト方法を知っています。

JLabelは次のものを使用します。

FontMetrics fm = getFontMetrics(getFont());

または、FontRenderContext()が必要な場合は、おそらくオブジェクトの getGraphics()メソッドを使用できます。通常、このメソッドを使用しないことをお勧めしますが、それは人々がGraphicsオブジェクトでカスタムペイントを実行しようとするためです。しかし、この場合は、Graphicsオブジェクトでテキストを測定してOKにするだけです。

4
追加された
つまり、 getGraphics はそのような目的のためですか?
追加された 著者 Pacerier,
ありがとう。私のここで私を導いたユースケースでは、レンダリングされた日付に対応するために、最初から列がちょうど正しい幅であるテーブルを作成したいと思います。私はこれを "setVisible"の直後にやってみるのがいいと思いますが、これを行うにはいくつかの方法があるようです...
追加された 著者 mike rodent,
blimey、かなり大胆なもの... preferredSize()をオーバーライド私は意味します。あなたには、この情報を使って何をしますか?preferredSizeは実現中に呼び出されるためですか?私は、実現後にコンポーネントのサイズを調整するよりも優れているとは言えませんが、危険な習慣のために望ましくありません。あなたは私がいる場合aioobeの提案に私の考えのあなたの見解を教えてください。
追加された 著者 mike rodent,
@mikerodent、私はそれを理解していないか、質問の必要条件がないので、私はaioobeの提案に対する考えを持っていません。このような質問は、ポスターがスウィングの仕組みを理解していないときに発生します。この質問は、paintComponent()が呼び出される前にOPがサイズを必要と考える理由を具体的な理由(または例)には示しません。私の提案は、Swingコンポーネントが行うため、getPreferredSize()メソッドをオーバーライドすることでした。私はこのアプローチに従わない理由は見ません。
追加された 著者 camickr,
@mikerodent、レンダリングされた日付に合わせて、最初から列がちょうど右の幅になるテーブルを作成したい - テーブル列調整器を参照してください。
追加された 著者 camickr,

TextLayout may be useful in this context. This example compares the result with that obtained from a text component's FontMetrics, and this example expands on @aioobe's BufferedImage suggestion.

3
追加された

または、コンポーネントコンストラクタでこれを行うこともできます

Font font = Font.createFont(Font.TRUETYPE_FONT, new File("ARIAL.TTF"));
font = font.deriveFont(12f);
FontMetrics fontMetrics = getFontMetrics(font);
2
追加された
いいねまたは単にFontMetrics fontMetrics = getFontMetrics(getFont())...つまり、コンポーネントのフォントを使用します。
追加された 著者 mike rodent,

aioobeの答えに続いて、それはグラフィックを手に入れる巧妙な方法です。多分誰もがこれを理解しているかもしれませんが、Graphicsオブジェクトには特定のフォントが付属しています.aioobeの一般的なGraphicsの取得方法は何でもかまいません。

私はこれをやらなければならなかった(Jython):

g = java.awt.image.BufferedImage(1, 1, java.awt.image.BufferedImage.TYPE_INT_RGB).graphics
g.font = my_table.font

その後、これは何かが実現する前に、正確な数字を返します... hurray:

hw_width = g.fontMetrics.stringWidth( "Hello World" )
0
追加された