私はちょうどビデオゲームのコーディングを始めました。私は、JPanelですべての図面を作成し、そのパネルをJFrameに取り付けることはJFrameに描画するよりも優れていると聞いてきました。なぜこれがより良いのだろうと思っていただけですか?JPanelをより良く取り付けるのはなぜですか?
答えて
それを含む様々な理由のために優れている:ほとんどのSwingコンポーネントで
- は、カスタムペイントが
paintComponent(Graphics)
メソッドをオーバーライドすることで達成されます。トップレベルスイングコンテナ(例:JFrame
、JApplet
、JWindow
)はpaint(Graphics)
です。一般的な塗装方法の結果として、回答者は一般的なコンポーネントとトップレベルのコンポーネントの違いを忘れてしまい、そのためばかげたアドバイスを提案します。 ;) JComponent
がJFrame
、又はJApplet
、又はJDialog
、又はJPanel
、又はJInternalFrame
におけるレイアウトの制約、またはに加えることができます..あなたのGUIが完成したと思っているときに、クライアントは「ねえ、ツールバー&をアプレットとして提供するのは素晴らしいことではないでしょうか?JComponent
アプローチはそれに容易に適応します。- リチャンテの説明したように、カスタムコンポーネントをペイントするのに必要な座標を計算する方が簡単です。好ましいサイズの場合は、
JFrame
のサイズを「正確に正しいサイズ」に調整すると、 (pack()
を使用して)GUIを格納します。他のコンポーネントも追加されている場合は特にそうです。今
、提供アドバイスを持つ2つのマイナーな意見の相違。
コンポーネント全体がカスタムペイントされている場合は、BufferedImage
をImageIcon
/JLabel
のコンボ内に置き換える方がよい場合があります。 painting to an imageの例を示します。
それはそれを更新する時間が来る:
- コール
getGraphics()
上Graphics2D
- そのグラフィックインスタンスにカスタムペイントを描く
- グラフィックス・インスタンスの処分
- コール
repaint()
ためGraphics
またはcreateGraphics()
のためにラベル。
パネルのUIデリゲートを取得することにはいくつかの利点があります。 – trashgod
@trashgod私に思い出させてくれてありがとう。しかし、私は理解していないいくつかのことがあります。 1)パネルのUIは、['JPanel.getUI()'](http://docs.oracle.com/javase/7/docs/api/javax/swing/JPanel.html#getUI%28 %29)、それは正しいですか? 2) 'JComponent'がそれ自身のUIデリゲートではない(アクセス権を持っている/持っている)のはなぜですか? 3)私はこれらの問題について私自身の質問を開始すべきですか? –
'JComponent'にはデリゲート自体はありませんが、サブクラスには基本的なインフラストラクチャが用意されています。 [*カスタムスイングコンポーネントを書く方法*](http://today.java.net/pub/a/today/2007/02/22/how-to-write-custom-swing-component.html)例。 – trashgod
ダブルバッファリングを行うのは簡単な方法です。
少し詳しく説明しましょう。ビデオゲームでは、再描画によるちらつきを避け、よりスムーズなグラフィックスを表示するために、通常はダブルバッファリングを使用します。彼らは、オフスクリーンのサーフェスを作成し、その上にすべてを描画し、オフスクリーンサーフェス全体を一度に画面上に表示します。 2Dでは
と、これを行う最も簡単な方法をスイング、単にJPanelの上のあなたのゲームのスプライトの描画を行い、その後、JFrameのにJPanelのを追加することです。
第2に、JPanelで物を描くことによって、ゲームループ内で手作業でペイントすることなく、より多くのGUIウィジェットおよび他のグラフィックオブジェクトをJFrameに表示することができます。例えば、ボタン、メニュー、他のパネル、他のレンダリングJPanel。
第3に、ゲームに自動的に翻訳された座標を使用することができます。ウィンドウの境界線幅、タスクペイン、タイトルなどのウィンドウマネージャ固有のことについて心配することなく、左上から右下まですべてを描画できます!
また、これが唯一のJavaでゲームプログラマが使用するだけで慣例ではありません。 ゲームボード、レンダリングパネルまたはグラフィックスウィジェットは、GUIツールキットなどの内部メインループを持つライブラリを使用してゲームをプログラミングする場合に非常に一般的です。 WindowsフォームのユーザーフォームとGTK +の図面ボードを使用できます。
JPanelに画像を描画し、JPanelをJFrameに追加する方法は、ダブルバッファリングの仕方ではありません。私はかなりあなたがJFrameでダブルバッファリングできると確信しています。 – Richante
@リチャンテ私は非常にうまくいけば、JPanelを使用していたJFrameでバッファをダブルバッファできることは、Java2DとSwingでダブルバッファリングを行う_only_方法ではなく、もっともらしい方法です。 – ApprenticeHacker
@リチャンテも、ダブルバッファリングを行う方法はなぜですか?その目的のためにかなり頻繁に使用されています。 – ApprenticeHacker
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)はフレーム全体の左上隅であり、可視領域の隅ではないためです。
- 1. JPanelの左上にすべてのシェイプが貼り付けられているのはなぜですか?
- 2. なぜレールを取り付けることができないのですか?
- 3. Cassandra CLIチュートリアルの切り取りと貼り付けが機能しないのはなぜですか?
- 4. これはなぜより良い実行ですか?
- 5. はなぜReferrenceErrorを受け付けております:BinaryFileは
- 6. なぜゲッターとセッターを外付けキーで作り続けるのですか?
- 7. SQLのクエリをより速く、より良くする
- 8. ピボットテーブルを切り取りおよび貼り付けするにはどうすればよいですか?
- 9. なぜconsole.logは値の代わりに関数を貼り付けますか?
- 10. URLSessionリクエストはサーバーで受け付けなくなりました
- 11. なぜ私のCodeigniterデータベースクエリは、より多くの代わりに1つの行を返すだけですか?
- 12. データを見つけるためにループするよりも速く、より良い方法ですか?
- 13. 強く型付けされたASP.NET MVCセッションのより良い方法
- 14. ParseConfigとParseQuery - より速く/より良いのはどれですか?
- 15. JFrameで描画するのがJPanelよりもずっと遅いのはなぜですか?
- 16. なぜ私のPlaneGeometryは影を受け取りませんか?
- 17. より良い色付け機能を実行するにはどうすればよいですか?
- 18. Javascript - 貼り付けイベントの前に貼り付けデータを取得する
- 19. PIPモジュールの取り付け
- 20. UITableView - セパレータを取り除く(クリアするだけではない)
- 21. キーストーンなしでスウィフトを取り付けることはできますか?
- 22. パス名の先頭にドライブ名または番号を付けるよりも、ファイルシステムをマウントする方が良い設計オプションはなぜですか?
- 23. 複数の型を受け入れるC#関数を書くより良い方法はありますか?
- 24. JPanelにJPanelを追加すると、最初のJPanelのサイズが小さくなります
- 25. システムgrepをRubyでのマッチングより遅くするのはなぜですか?
- 26. `-k`をつけ、` -k`を付けないでくり返し
- 27. JPanelのコンテンツは、別のJframeから開くと黒くなります
- 28. DAOでデータクラスをデコレートするのではなく、より良いパターンがありますか?
- 29. JavaスイングのJPanelで余分なパディングを取り除くにはどうすればいいですか?
- 30. MatchedErrorはLinearSeqではなくIndexedSeqを受け取ります
あなたのソースは何ですか? – mre
@mreこれは私がよくお勧めする(またはそれに近い - 私の答えを見て)ものですが、その情報に関するOPの正確な情報源を聞くことにも興味があります。質問をしている人に。これは、そのわずかな量の情報で「良い質問」になるでしょう。 –
+1、私は答えを知っているいくつかのJavaの質問の一つです。 [Java RPG Game](https://github.com/intermediate-hacker/Pro_RPG)を作成したら、それを堪能してください。 :) – ApprenticeHacker