4

FontMetricsのインスタンスを取得するためのよりフレンドリーな方法はありますか

FontMetrics fm = Graphics.getFontMetrics(Font);

次の例のため、私はこの方法が嫌いです。

ゲームでメニューを作成し、画面の中央にすべてのメニュー項目を配置する場合は、フォントメトリックが必要です。ただし、ほとんどの場合、メニュー項目はクリック可能です。だから私は配列を作成し、Rectanglesすべての長方形がアイテムの周りに収まるので、マウスが押されたときに簡単に使用できます

for (int i = 0; i < rects.length; i++)
if (rects[i].contains(mouseX, mouseY)) { ... }

ただし、rectを作成するには、座標にFontMetricsも必要です。つまり、これは、メニューのペイントメソッドですべての長方形を作成する必要があることを意味します。

したがって、コンストラクターによって呼び出されるメソッドでRectanglesを構築できるように、FontMetricsを取得する方法が必要です。

4

6 に答える 6

6

本当に正しい答えは、Toolkitを使用することです。

Font font = new Font("Courier New", Font.PLAIN, 14);
FontMetrics fm = Toolkit.getDefaultToolkit().getFontMetrics(font);
于 2013-02-06T13:04:22.847 に答える
2

背景コンポーネント、つまりメニューの背後にあるものがレンダリングされるとGraphics、特定のフォントのメトリックを一度だけ取得するために使用できるオブジェクトが含まれます。

メソッドでこれを実行したくないのは確かですpaint。可能な限り軽量にする必要があります。コンポーネントが最初にレンダリングされるときに呼び出されるリスナーにこのコードを掛けます。結果の FontMetrics オブジェクトを、後でアクセスできる場所 (paintこれらのメニュー項目ボックスを描画するためのメソッド内) に格納できます。

最後の瞬間、つまりpainting 時にメニュー グラフィックの寸法を決定するのではなく、代わりに、メニューを表すコンポーネントをいくつか作成することをお勧めします。これらのコンポーネントを Glass Pane に配置すると、他のすべての上に浮くようになります。これらのコンポーネントはすべて、マウス クリックを受け入れてリスナー イベントを発生させることができるという追加のボーナスがあります。独自のジオメトリでイベントをキャプチャするため、メニューのどの部分がクリックされたかを把握する必要さえありません。

ここでコンポーネントを使用するもう 1 つの利点は、フォント メトリックをいじる必要を完全に回避できることです。既製のメニュー項目がありますがJLabels、単に を使用して配置を指定したり、 を使用しLayoutManagerて最大のラベルの幅に合わせてボックスのサイズを変更したりできます。

于 2010-05-02T13:19:50.543 に答える
1

メニュー テキストが固定されていると仮定すると、アルファ透明度を使用してBufferedImageにテキストを事前に描画し、計算を行うことができます。次に、メニュー テキストが必要な場合は、画像を描画します。

画像を中央に配置するためにオフセット計算を行う必要がありますが (パネル サイズが変更される可能性があると仮定)、これらは比較的軽量である必要があります。

于 2010-05-02T13:27:55.780 に答える
1

これは良い解決策だと思います

private static HashMap<Font, FontMetrics> fontmetrics = new HashMap<Font, FontMetrics>();


public static FontMetrics getFontMetrics(Font font)
{
    if (fontmetrics.containsKey(font))
    {
        return fontmetrics.get(font);
    }
    FontMetrics fm = createFontMetrics(font);
    fontmetrics.put(font, fm);
    return fm;
}

private static FontMetrics createFontMetrics(Font font)
{
    BufferedImage bi = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB_PRE);
    Graphics g = bi.getGraphics();
    FontMetrics fm = g.getFontMetrics(font);
    g.dispose();
    bi = null;
    return fm;
}
于 2010-05-02T14:17:34.950 に答える
0

ロンザックが言ったことに加えて、これはどうですか:

public static FontMetrics getFontMetrics(Font font){
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    GraphicsDevice gd = ge.getDefaultScreenDevice();
    GraphicsConfiguration config = gd.getDefaultConfiguration();

    Canvas c = new Canvas(config);
    return c.getFontMetrics(font);
}

「config」変数を静的変数として保存して、ゲーム/開発環境の他のフォント関連情報を含むユーティリティ フォント クラスで一度構築されるようにすることができます。canvas 変数でもこれを行うことができると思います。

于 2014-05-10T23:34:44.750 に答える