2011-01-06 3 views
2

Я работаю над пользовательским интерфейсом Swing, в котором хочу сосредоточить несколько компонентов (JDialogs и JFrames). Я знаю, что следующий код будет рассчитать размер экрана пользователя, а оттуда, я могу легко центрировать компонент:Java Swing: Центрирующие компоненты

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

Ради эффективности, я должен рассчитывать только на этот раз и хранить его в каком-то постоянная, так его можно использовать повторно в любой части проекта. Какова наилучшая практика для хранения этого для последующего повторного использования, чтобы он был доступен через несколько классов?

(Кроме того, если есть лучший способ вычисления размера экрана для центрирования, я был бы открыт для слуха, что а)

+0

Я абсолютно не пытайся кэшировать размер экрана; он не будет иметь никакого существенного влияния на опыт пользователя. –

ответ

3

java.awt.Window.setLocationRelativeTo(null) будет центрировать его на экране в то время как setLocationRelativeTo(someComponent) будет центрировать его по отношению к java.awt.Component, некоторыеComponent.

Одна вещь, которую следует учитывать при альтернативном хранении центра, заключается в том, что если пользователь настраивает свое разрешение во время работы программы, а сохраненные константы больше не будут действительны. Напоминает ли функция getScreenSize действительно дорого? (Я не знаю, является ли это или нет)

+0

И передача относительного компонента, если одно окно должно быть центрировано над другим. –

+0

@Software Monkey Да, я добавлю это. Благодарю. –

+1

Это помещает верхний левый угол компонента в центр, но не весь компонент. – Charlotte

1

Для центрирования объекта вы должны попробовать:

Положение кадра в X = (половина ширины кадра) - (половина экрана ширина размера) Почти то же самое для Y = (половина высоты кадра) - (половина высоты экрана)

вы можете легко сохраняет значения в главном классе с открытым доступом, так что вам не нужно читать их несколько раз

+0

О, отлично, я полностью забыл setLocationRelativeTo (null), избегаю ответа, кто-то удалит его –

+0

Я знаю, как делать простые вычисления для центрирования компонента.Мой вопрос был больше о том, где хранить постоянную размер экрана, чтобы он был виден всем классам, которым необходимо использовать размер экрана. – Charlotte

+0

@Charlotte вы можете сделать их публичными статическими членами вашего основного класса. Но я не рекомендую это делать. –

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); 
    }