2

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

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

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

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

4

4 回答 4

3

java.awt.Window.setLocationRelativeTo(null)将它在屏幕上setLocationRelativeTo(someComponent)居中,同时相对于 java.awt.Component, someComponent居中。

存储中心的替代方案要考虑的一件事是,如果用户在程序运行时调整其分辨率,则存储的常量将不再有效。召回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 回答