Java Swing: центрирование компонентов - PullRequest
2 голосов
/ 06 января 2011

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 06 января 2011

java.awt.Window.setLocationRelativeTo (null) будет центрировать его на экране, тогда как setLocationRelativeTo(someComponent) будет центрировать его относительно java.awt.Component, someComponent .

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

2 голосов
/ 07 января 2011

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

Это означает, что размер диалогового окна / фрейма равен (0, 0). Ваш основной код должен быть:

frame.add( .... );
frame.pack();
frame.setLocationRelativeTo( null );
frame.setVisible( true );
1 голос
/ 06 января 2011

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

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

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

0 голосов
/ 07 января 2011

Кроме того, если вы делаете это самостоятельно, вам нужно учитывать вкладки экрана, используя 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);
    }
...