2012-04-09 3 views
5

私はちょうどビデオゲームのコーディングを始めました。私は、JPanelですべての図面を作成し、そのパネルをJFrameに取り付けることはJFrameに描画するよりも優れていると聞いてきました。なぜこれがより良いのだろうと思っていただけですか?JPanelをより良く取り付けるのはなぜですか?

+3

あなたのソースは何ですか? – mre

+0

@mreこれは私がよくお勧めする(またはそれに近い - 私の答えを見て)ものですが、その情報に関するOPの正確な情報源を聞くことにも興味があります。質問をしている人に。これは、そのわずかな量の情報で「良い質問」になるでしょう。 –

+0

+1、私は答えを知っているいくつかのJavaの質問の一つです。 [Java RPG Game](https://github.com/intermediate-hacker/Pro_RPG)を作成したら、それを堪能してください。 :) – ApprenticeHacker

答えて

9

それを含む様々な理由のために優れている:ほとんどのSwingコンポーネントで

  • は、カスタムペイントがpaintComponent(Graphics)メソッドをオーバーライドすることで達成されます。トップレベルスイングコンテナ(例:JFrameJAppletJWindow)はpaint(Graphics)です。一般的な塗装方法の結果として、回答者は一般的なコンポーネントとトップレベルのコンポーネントの違いを忘れてしまい、そのためばかげたアドバイスを提案します。 ;)
  • JComponentJFrame、又はJApplet、又はJDialog、又はJPanel、又はJInternalFrameにおけるレイアウトの制約、またはに加えることができます..あなたのGUIが完成したと思っているときに、クライアントは「ねえ、ツールバー&をアプレットとして提供するのは素晴らしいことではないでしょうか? JComponentアプローチはそれに容易に適応します。
  • リチャンテの説明したように、カスタムコンポーネントをペイントするのに必要な座標を計算する方が簡単です。好ましいサイズの場合は、JFrameのサイズを「正確に正しいサイズ」に調整すると、 (pack()を使用して)GUIを格納します。他のコンポーネントも追加されている場合は特にそうです。今

、提供アドバイスを持つ2つのマイナーな意見の相違。

コンポーネント全体がカスタムペイントされている場合は、BufferedImageImageIcon/JLabelのコンボ内に置き換える方がよい場合があります。 painting to an imageの例を示します。
それはそれを更新する時間が来る:

  1. コールgetGraphics()Graphics2D
  2. そのグラフィックインスタンスにカスタムペイントを描く
  3. グラフィックス・インスタンスの処分
  4. コールrepaint()ためGraphicsまたはcreateGraphics()のためにラベル。
+1

パネルのUIデリゲートを取得することにはいくつかの利点があります。 – trashgod

+0

@trashgod私に思い出させてくれてありがとう。しかし、私は理解していないいくつかのことがあります。 1)パネルのUIは、['JPanel.getUI()'](http://docs.oracle.com/javase/7/docs/api/javax/swing/JPanel.html#getUI%28 %29)、それは正しいですか? 2) 'JComponent'がそれ自身のUIデリゲートではない(アクセス権を持っている/持っている)のはなぜですか? 3)私はこれらの問題について私自身の質問を開始すべきですか? –

+0

'JComponent'にはデリゲート自体はありませんが、サブクラスには基本的なインフラストラクチャが用意されています。 [*カスタムスイングコンポーネントを書く方法*](http://today.java.net/pub/a/today/2007/02/22/how-to-write-custom-swing-component.html)例。 – trashgod

6

ダブルバッファリングを行うのは簡単な方法です。

少し詳しく説明しましょう。ビデオゲームでは、再描画によるちらつきを避け、よりスムーズなグラフィックスを表示するために、通常はダブルバッファリングを使用します。彼らは、オフスクリーンのサーフェスを作成し、その上にすべてを描画し、オフスクリーンサーフェス全体を一度に画面上に表示します。 2Dでは

Double Buffering

と、これを行う最も簡単な方法をスイング、単にJPanelの上のあなたのゲームのスプライトの描画を行い、その後、JFrameのにJPanelのを追加することです。

第2に、JPanelで物を描くことによって、ゲームループ内で手作業でペイントすることなく、より多くのGUIウィジェットおよび他のグラフィックオブジェクトをJFrameに表示することができます。例えば、ボタン、メニュー、他のパネル、他のレンダリングJPanel。

第3に、ゲームに自動的に翻訳された座標を使用することができます。ウィンドウの境界線幅、タスクペイン、タイトルなどのウィンドウマネージャ固有のことについて心配することなく、左上から右下まですべてを描画できます!

translated co-ordinates

また、これが唯一のJavaでゲームプログラマが使用するだけで慣例ではありません。 ゲームボードレンダリングパネルまたはグラフィックスウィジェットは、GUIツールキットなどの内部メインループを持つライブラリを使用してゲームをプログラミングする場合に非常に一般的です。 WindowsフォームのユーザーフォームとGTK +の図面ボードを使用できます。

+0

JPanelに画像を描画し、JPanelをJFrameに追加する方法は、ダブルバッファリングの仕方ではありません。私はかなりあなたがJFrameでダブルバッファリングできると確信しています。 – Richante

+0

@リチャンテ私は非常にうまくいけば、JPanelを使用していたJFrameでバッファをダブルバッファできることは、Java2DとSwingでダブルバッファリングを行う_only_方法ではなく、もっともらしい方法です。 – ApprenticeHacker

+0

@リチャンテも、ダブルバッファリングを行う方法はなぜですか?その目的のためにかなり頻繁に使用されています。 – ApprenticeHacker

5

JFrameには、メニュー、タイトルバー、境界線などが含まれています。したがって、座標を参照するときには、これらを考慮する必要があります。また、メニューバーやその他のコンポーネントをフレームに追加することもできます。ペイントがJPanel内にある場合、座標を参照する必要はありません。例えば

、試してみてください。

public class Test extends JFrame { 

public Test() { 
    super(); 
    setVisible(true); 
    setBounds(100, 100, 200, 100); 
} 

@Override 
public void paint(Graphics g) { 
    g.fillRect(0, 0, 50, 50); 
} 

public static void main(String[] args) { 
    new Test(); 
} 

} 

、あなたは黒い四角は四角ではないことがわかりますが! (0、0)はフレーム全体の左上隅であり、可視領域の隅ではないためです。

関連する問題