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

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

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

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

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

【问题讨论】:

  • 我绝对不会费心尝试缓存屏幕尺寸;它不会对用户体验产生任何实质性影响。

标签: java swing centering jdialog


【解决方案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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多