Java Swing:对中组件

时间:2011-01-06 20:02:08

标签: java swing centering jdialog

我正在开发一个Swing UI,我希望将多个组件(JDialogs和JFrames)集中在一起。我知道以下代码将计算用户的屏幕大小,从那里,我可以轻松地集中一个组件:

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

为了效率,我应该只计算一次并将其存储在某种常量中,以便可以在项目的任何部分重复使用。存储它以便以后重用的最佳实践是什么,因此可以跨多个类访问它?

(此外,如果有更好的方法来计算屏幕尺寸以进行居中,我也愿意听到这一点)

4 个答案:

答案 0 :(得分:3)

java.awt.Window.setLocationRelativeTo(null)会将其置于屏幕中心,而setLocationRelativeTo(someComponent)将相对于java.awt.Component, someComponent 居中。

存储中心的替代方案需要考虑的一点是,如果用户在程序运行时调整其分辨率,则存储的常量将不再有效。回想起getScreenSize函数真的很贵吗? (我不知道是不是)

答案 1 :(得分:2)

  

这会将组件的左上角置于中心,而不是整个组件

这意味着对话框/框架的大小为(0,0),您的基本代码应为:

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

答案 2 :(得分:1)

对于居中对象,您应该尝试:

X =(半帧宽)中的帧位置 - (半屏宽度) Y =(半帧高度) - (半屏幕高度)

几乎相同

您可以轻松地将值存储在具有公共访问权限的主类中,因此您不需要多次阅读它们

答案 3 :(得分: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);
    }