Java Swing:居中组件

Posted

技术标签:

【中文标题】Java Swing:居中组件【英文标题】:Java Swing: Centering components 【发布时间】:2011-06-04 21:25:36 【问题描述】:

我正在开发一个 Swing UI,我想在其中集中多个组件(JDialogs 和 JFrames)。我知道下面的代码会计算用户的屏幕尺寸,然后我可以轻松地居中一个组件:

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

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

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

【问题讨论】:

我绝对不会费心尝试缓存屏幕尺寸;它不会对用户体验产生任何实质性影响。 【参考方案1】:

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

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

【讨论】:

如果一个窗口要居中于另一个窗口,则传递相关组件。 @Software Monkey 是的,我会添加它。谢谢。 这会将组件的左上角放在中心,而不是整个组件。 对于相对于特定组件的情况?您可以操纵从someComponent.getBounds() 返回的Rectangle 来计算精确的中心。即)(左上角)+(宽度的一半,高度)以及“顶部”组件的宽度和高度。然后使用.setLocation 而不是.setLocationRelativeTo 来实现精确居中。 setLocationRelativeTo(someComponent) 似乎不适用于另一台计算机屏幕上的组件。即使它们是可见的,它也会将它们视为“屏幕外”。【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

哦,太好了,我完全忘记了 setLocationRelativeTo(null),避免我的回答,请有人删除它 我知道如何进行简单的计算以使组件居中。我的问题更多的是关于在哪里存储屏幕尺寸常量,以便所有需要使用屏幕尺寸的类都可以看到它。 @Charlotte 您可以将它们设为主类的公共静态成员。但我不建议这样做。【参考方案4】:

另外,如果您自己做,您需要使用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);
    

【讨论】:

以上是关于Java Swing:居中组件的主要内容,如果未能解决你的问题,请参考以下文章

Swing布局

java的swing组件的使用

Java详解菜单组件

关于Java swing组件焦点的问题(我猜可能是焦点的问题) 高分求全面

Java学习笔记7.3.1 用户界面 - Swing常用组件

Java学习笔记7.3.1 用户界面 - Swing常用组件