2011-01-06 8 views
2

私は、複数のコンポーネント(JDialogsとJFrames)を中心にしたいSwing UIに取り組んでいます。私は一度だけこれを計算する必要があり、効率の便宜上Java Swing:センタリングコンポーネント

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 

ので、定数のいくつかの種類に格納します。私は、次のコードは、ユーザーの画面サイズを計算し、そこから、私は簡単にコンポーネントを中央にすることができます知っていますプロジェクトのどの部分でも再利用できます。これを保存して後で再利用できるようにするベストプラクティスは何ですか?複数のクラスにまたがってアクセス可能です。 setLocationRelativeTo(someComponent)のに対して、それを中心に説明しながら

(センタリングするための画面のサイズを計算するより良い方法がある場合また、私は同様にそれを聞くに開放だろう)

+0

私は絶対に画面サイズをキャッシュしようと気にしないでしょう。ユーザの経験に何ら重要な影響を及ぼすことはありません。 –

答えて

3

java.awt.Window.setLocationRelativeTo(null)が画面上に中心に説明しますjava.awt.Component、someComponent

センターを格納する代わりに、プログラムが実行されている間にユーザーが解像度を調整しても、格納された定数が有効でなくなる場合があります。実際にはgetScreenSize関数が高価だと思いますか?以下のための(半分の画面サイズ幅) ほぼ同じ -

X =(半フレーム幅)でフレーム位置:あなたは試してみてくださいオブジェクトをセンタリングするため

+0

そして、あるウィンドウが別のウィンドウの中央に置かれる場合、相対コンポーネントを渡します。 –

+0

@ソフトウェアモンキーはい、私はそれを追加します。ありがとう。 –

+1

これはコンポーネントの左上隅を中央に置きますが、コンポーネント全体ではありません。 – Charlotte

1

を(私はそれがあるかどうかわかりません) Y =(半分のフレームの高さ) - (半分の画面サイズ高さ)

あなたがそれらを読む必要はありませんので、あなたは簡単に、公衆回線付きのメインクラス内の値を格納することができ、数回

+0

偉大な、私は完全にsetLocationRelativeTo(null)を忘れて、私の答えを避けて、誰かがそれを削除してください –

+0

私はコンポーネントをセンタリングするための簡単な計算を行う方法を知っています。私の質問は、画面サイズを使用する必要があるすべてのクラスに表示されるように、画面サイズ定数をどこに格納するかに関するものでした。 – Charlotte

+0

@Charlotteあなたは彼らにメインクラスのパブリックな静的メンバーを作ることができます。しかし、私はそれをすることをお勧めしません。 –

2

このコンポーネントの左上隅を中央に置きますが、コンポーネント全体ではありません

これは、ダイアログ/フレームのサイズがあることを意味(0、0)、あなたの基本的なコードは次のようになります。

frame.add(....); 
frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 
0

あなたはそれを自分で行う場合も、あなたが画面の中に考慮する必要がありますすべての画面の端にあり、任意のサイズのタスクバーのようなものを考慮に入れて、Toolkit.getScreenInsetsを使用します。

私は、Java 1.4をターゲットことができる前に、私が使用:

static public void centerWindow(Window wnd, Component relcom) { 
    Rectangle       scrbnd=getScreenBounds(wnd); 
    Dimension       wndsiz=wnd.getSize(); 
    Container       root=null; 
    int         px,py; 

    if(relcom!=null) { 
     if(relcom instanceof Window || relcom instanceof java.applet.Applet) { 
      root=(Container)relcom; 
      } 
     else { 
      Container parent; 
      for(parent=relcom.getParent(); parent!=null; parent=parent.getParent()) { 
       if(parent instanceof Window || parent instanceof java.applet.Applet) { 
        root=parent; 
        break; 
        } 
       } 
      } 
     } 

    if(relcom==null || !relcom.isShowing() || root==null || !root.isShowing()) { 
     px=(scrbnd.x+((scrbnd.width -wndsiz.width)/2)); 
     py=(scrbnd.y+((scrbnd.height-wndsiz.height)/2)); 
     } 
    else { 
     Point  relloc=relcom.getLocationOnScreen(); 
     Dimension relsiz=relcom.getSize(); 

     px=(relloc.x+((relsiz.width -wndsiz.width)/2)); 
     py=(relloc.y+((relsiz.height-wndsiz.height)/2)); 
     } 

    if((px+wndsiz.width)>(scrbnd.x+scrbnd.width)) { px=((scrbnd.x+scrbnd.width)-wndsiz.width); } 
    if((py+wndsiz.height)>(scrbnd.y+scrbnd.height)) { py=((scrbnd.y+scrbnd.height)-wndsiz.height); } 
    if(px<scrbnd.x) { px=scrbnd.x; } 
    if(py<scrbnd.y) { py=scrbnd.y; } 
    wnd.setLocation(px,py); 
    }