繁体   English   中英

Java Swing:居中组件

[英]Java Swing: Centering components

我正在使用一个Swing UI,希望在其中将多个组件(JDialogs和JFrames)居中。 我知道以下代码将计算用户的屏幕尺寸,从那里,我可以轻松地将组件居中:

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

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

(此外,如果有一种更好的方法来计算屏幕大小以进行居中,我也很乐意听到)

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

备用存储中心时要考虑的一件事是,如果用户在程序运行时调整其分辨率,则存储的常量将不再有效。 调用getScreenSize函数实际上是昂贵的吗? (不知道是不是)

这样会将组件的左上角放在中心,而不是整个组件

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

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

为了使对象居中,您应该尝试:

X中的帧位置=(半帧宽度)-(半屏尺寸宽度)Y的几乎相同=(半帧高度)-(半屏尺寸高度)

您可以通过公共访问轻松地将值存储在主类中,因此您无需多次读取它们

另外,如果您自己执行此操作,则需要使用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);
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM