2011-01-06 77 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); 
    }