2011-01-06 67 views
2

我正在使用一个Swing UI,其中我想将多个组件(JDialogs和JFrames)居中。我知道下面的代码将计算用户的屏幕尺寸,并从那里,我可以很容易地中心中的部件:Java Swing:居中组件

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

出于效率的缘故,我只应该再计算这个并将其保存在某种恒定,从而它可以在项目的任何部分重用。什么是存储这个以供以后重用的最佳实践,因此可以跨多个类访问?

(此外,如果计算的屏幕尺寸为中心的一个更好的办法,我会打开来听为好)

+0

我绝对不会打扰试图缓存的屏幕尺寸;它对用户体验无任何实质影响。 – 2011-01-06 20:27:38

回答

3

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

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

+0

如果一个窗口要以另一个窗口为中心,则传递相关组件。 – 2011-01-06 20:30:33

+0

@Software Monkey是的,我会补充一点。谢谢。 – 2011-01-06 20:31:31

1

为中心的对象,你应该尝试:

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

您可以轻松地存储在公共接入的主要类中的值,这样你就不会需要阅读他们几次

2

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

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

frame.add(....); 
frame.pack(); 
frame.setLocationRelativeTo(null); 
frame.setVisible(true); 
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); 
    }