2

Javaのswingライブラリに単純なウィンドウスケールを実装しようとしています。目標は、ウィンドウの高さと幅を2倍にし、ウィンドウとその各コンポーネントを縮尺どおりにペイントすることです。

これが私が使用しているコードの例です:

public class MyWindow extends JFrame {

...

public void paint(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.scale(2,2);
    super.paint(g);
}
}

このウィンドウ内の各コンポーネントの位置とサイズは、ウィンドウのレイアウトがnullのsetBoundsを使用して手動で設定されます。

私が実際にプログラムを実行すると、ウィンドウの最初のペイントが成功したように見えます。すべてが適切なサイズになっています。ただし、コンポーネントによる後続の各再ペイントは、サイズの2倍でも、適切な場所でもありません。これが私が意味することです:

ゲームビュー

ご覧のとおり、手動で再描画を呼び出すコンポーネント(アニメーションビット)を含む画面の部分は、JFrameのGraphics2Dスケールを使用していないようです。ソースコードを調べて、他のいくつかのメソッド(ほとんどの場合、更新と再描画)をオーバーロードしようとしましたが、すべて同じ結果が得られたようです。コンポーネントクラスとコンテナクラスのpaintメソッドとrepaintメソッドをさらに調べましたが、それらはすべて、親の指定された再ペイントを呼び出しているようです。私のウィンドウは「最大の」親になるべきではありませんか?もしそうなら、なぜこれらの再描画呼び出しが私のウィンドウに到達しなかったのですか?

したがって、あなたへの私の大きな質問は、親コンポーネントのどの再描画メソッドが子コンポーネントを呼び出すかということです。呼び出しがJFrameのペイント呼び出しに適切にルーティングされないのはなぜですか?ウィンドウを拡大縮小する他の(より良い)方法はありますか?ありとあらゆる助けに感謝します!

4

2 に答える 2

1

「 AWTでのペイントとSwing:ペイントメソッド」で説明されているように、「SwingプログラムはオーバーライドpaintComponent()するのではなくオーバーライドする必要がありますpaint()。」一般的なアプローチは、ここに示すように、(またはサブクラス)をオーバーライドしてビューを作成することです。ここで説明するように、ビューでゲームのモデルの変更をリッスンしますpaintComponent()JComponent

SwingUtilities.updateComponentTreeUI()ビューを更新するのではなく、ルックアンドフィールを変更するために使用する必要があります。

于 2012-04-18T06:08:34.123 に答える
0

使用する

javax.swing.SwingUtilities.updateComponentTreeUI(parentComponent);

parentComponent子コンポーネントのすべてのルックアンドフィールが適切に更新されていることを確認する必要がある場合。

于 2012-04-18T00:23:05.423 に答える