2

複数のコンポーネント(JDialogsとJFrames)を中央に配置したいSwingUIに取り組んでいます。次のコードがユーザーの画面サイズを計算することを知っています。そこから、コンポーネントを簡単に中央に配置できます。

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

効率を上げるために、これを1回だけ計算し、プロジェクトのどの部分でも再利用できるように、ある種の定数に格納する必要があります。複数のクラス間でアクセスできるように、後で再利用するためにこれを保存するためのベストプラクティスは何ですか?

(さらに、センタリングの画面サイズを計算するためのより良い方法があれば、私もそれを聞いてくれるでしょう)

4

4 に答える 4

3

java.awt.Window.setLocationRelativeTo(null)は、画面のsetLocationRelativeTo(someComponent)中央に配置し、java.awt.Component、someComponentを基準にして中央に配置します。

センターを保存する代わりに考慮すべきことの1つは、プログラムの実行中にユーザーが解像度を調整すると、保存された定数が無効になることです。関数のリコールはgetScreenSize実際に費用がかかりますか?(そうであるかどうかはわかりません)

于 2011-01-06T20:09:02.393 に答える
2

これにより、コンポーネントの左上隅が中央に配置されますが、コンポーネント全体は配置されません。

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

frame.add( .... );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
于 2011-01-06T21:37:42.997 に答える
1

オブジェクトを中央に配置するには、次のことを試してください。

Xでのフレーム位置=(半分のフレーム幅)-(半分の画面サイズ幅)Y =(半分のフレーム高さ)-(半分の画面サイズの高さ)でほぼ同じ

パブリックアクセスを使用してメインクラスに値を簡単に保存できるため、値を何度も読み取る必要はありません。

于 2011-01-06T20:09:29.660 に答える
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);
    }
于 2011-01-06T22:31:29.890 に答える