私の質問は、JFrameで直接描画した場合と比べてJPanelで描画すると、同じスイングカスタム描画ルーチンがほぼ16倍高速になるのはなぜですか?ダブルバッファリングですか?確かにできない?JFrameで描画するのがJPanelよりもずっと遅いのはなぜですか?
背景:JFrameが保護されていない(特に部分的にしか見えない)ときに、カスタムペイントがリフレッシュされないという問題がありました。 SOを検索した後、私はJPanelのサブクラスをbluddy-NetBeans-form-designerフォームに配線する方法を決定しました。
同じ状況の人:NetBeansでは、ちょうどJPanelを拡張する新しい標準クラス(JPanelフォームではない)を作成し、そこにあるすべてのコードを手作業でコーディングする必要があります(GUIデザイナーなし、オレ日、一息)。次に、標準のJPanelをフォームに追加し、サイズを設定します。右クリックして "コードのカスタマイズ"を選択し、コンボボックスで "カスタム作成"を選択します。ここで新しいjavax.swing.JPanelが作成され、そのサブクラスが置換されます。
だから、フォームに直接ではなく、コンポーネントを適切に操作してペイントすることができました。また、パネルのキーリスナーは、フレームキーイベントディスパッチャーを差し込むよりもはるかに巧妙な解決策です。
とにかく、JPanelのpaintComponent()でappotated JFrameのpaint()と同じカスタム塗りつぶしコードがほぼ同じ速度で実行されると、誰かがなぜ説明できるのか不思議でした。
ありがとうございます。キース。
EDIT:この質問は誤解メトリックに基づいています。プロファイラは、JPanelのpaintComponent()メソッドをAWT-EventQueueスレッドにインクルード/レポートしません。ここで、ベースラインプロファイルにはJFrameのpaint()が含まれています。私は愚かな質問をする前にもっと慎重に見ていたはずです。私の悪い。
プロファイラVisualVM iircは、どのメソッドがより時間をかけているかを示す必要があります。それは何が起こっているのかを見つける良いスタートになるでしょう。 –
@JonathanDrapeau:そうです!プロファイルは、 "AWT-Event-Queue"スレッドの一部としてpaintComponentを報告していません(JFrameペイントの場合)。したがって、2つのソリューションがどのように報告されるかの違いです。私の悪い! – corlettk
これは非常に具体的な質問です。なぜなら、AWTコンポーネントへのペインティングは子どものSwing JComponentsの方が早い(ネイティブOSからのピア)ためですが、すでに先史時代について話しています。 Nimbusで使用されている新しいGraphicsコアと、JavaFXの基本として小さな変更を加えた同じ(AFAIK) – mKorbel