2012-01-27 9 views
2

私のスイングGUIのほとんどは、自分自身を中心に置く直前にちらつきを感じました。これは、私が作ったほぼすべてのJFrameで起こりました。回避策があるかどうか疑問に思っていました。私は通常setVisible(true)、次にpack()とし、その後にsetLocationRelativeTo(null)とします。これは右上に表示され、それからそれを中心にします。私はちらつきが起こっていることを知っていますが、それはそれぞれのメソッド呼び出しに時間がかかりますが、これを回避する方法があります。場所を移動する前のJFramesのフリッカー

答えて

7

この順序(およびこれらのメソッド)が優れていますlike this

もちろん、フリッカーがなくても、揺らぶことなく、またはが揺れます。 ;)


ことに伴う問題(setLocationRelativeTo(null))は、GUIの右上隅全体JFrameの中心とされないことです。

と呼ばれている(あなたが現在行っているとしてではなくpack()を使用)JFrameのdefualtサイズは0x0です、それはpack()またはsetSize()までそのようにとどまります。したがって、0x0コンポーネントを画面の中央に配置するよう要求すると、JREは0x0サイズのコンポーネントの「中間ピクセル」を画面の正確な中央に配置します。

最初にパックする場合、のサイズはであり、この方法は期待どおりに動作します。例えば。

frame.pack(); 
frame.setLocationRelativeTo(null); // show my splash screen! 
frame.setVisible(true); 
+1

+1は 'setLocationByPlatform()'のために+1します。 – trashgod

2

最後にsetLocationRelativeTo(null)、次にsetVisible(true)を実行する必要があります。

  1. frame.pack();
  2. frame.setLocationByPlatform(true); // superior to centering
  3. frame.setVisible(true);

あなたがそれを行うの可視フレームの数を設定した場合、彼らは何かを表示されることがあります。

+0

問題点は、GUIの右上が中央になり、JFrame全体ではないことです。 – imbuedHope

+0

'pack()'は、 'setLocationRelativeTo(null)'の前に***と呼ばれ、中央に置く必要があります。私はそれがGP Singhが意味するものだと思います。 (しかし私の答えでは、メソッド呼び出しの順番についてもっと明示していました) –

+0

私の答えを編集することも見てください。うまくいけば何が起こっているのか説明します。 –

関連する問題