Диспетчер компоновки Java вертикальный центр - PullRequest
11 голосов
/ 22 мая 2009

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

Я также попробовал макет границы и поместил его в центр, но размер окна изменился до размера окна.

Ответы [ 4 ]

23 голосов
/ 22 мая 2009

Попробуйте использовать GridBagLayout и добавить панель с пустым GridBagConstrants объектом.
Например:

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setLayout(new GridBagLayout());
    JPanel panel = new JPanel();
    panel.add(new JLabel("This is a label"));
    panel.setBorder(new LineBorder(Color.BLACK)); // make it easy to see
    frame.add(panel, new GridBagConstraints());
    frame.setSize(400, 400);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
}
10 голосов
/ 22 мая 2009

Во-первых, я должен упомянуть, прочитайте мою статью о макетах: http://web.archive.org/web/20120420154931/http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/. Это старая, но очень полезная (к сожалению, эта статья предшествует BoxLayout. У меня есть несколько слайдов, когда я выступал на JavaOne, включая BoxLayout на http://javadude.com/articles/javaone)

Попробуйте BoxLayout:

Box verticalBox = Box.createVerticalBox();
verticalBox.add(Box.createVerticalGlue());
verticalBox.add(stuffToCenterVertically);
verticalBox.add(Box.createVerticalGlue());

и если вы хотите центрировать эти вещи, используйте HorizontalBox в качестве вещи ToCenterVertically:

Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(stuffToCenter);
horizontalBox.add(Box.createHorizontalGlue());

Гораздо проще "увидеть" в коде, чем gridbag

0 голосов
/ 23 мая 2009

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

Текущая реализация макетов первого видимого потомка, вы тоже можете это изменить ...

public class CentreLayout implements LayoutManager, java.io.Serializable {

public void addLayoutComponent(String name, Component comp) {
}

public void removeLayoutComponent(Component comp) {
}

public Dimension preferredLayoutSize(Container target) {
    return target.getPreferredSize();
}

public Dimension minimumLayoutSize(Container target) {
    return target.getMinimumSize();
}

public void layoutContainer(Container target) {
    synchronized (target.getTreeLock()) {
        Insets insets = target.getInsets();
        Dimension size = target.getSize();
        int w = size.width - (insets.left + insets.right);
        int h = size.height - (insets.top + insets.bottom);
        int count = target.getComponentCount();

        for (int i = 0; i < count; i++) {
            Component m = target.getComponent(i);
            if (m.isVisible()) {
                Dimension d = m.getPreferredSize();
                m.setBounds((w - d.width) / 2, (h - d.height) / 2, d.width, d.height);
                break;
            }
        }
    }
}

}
0 голосов
/ 23 мая 2009

GroupLayout на самой панели, с GroupLayout.Alignment.CENTER, для вертикальной и горизонтальной, и setPreferredSize(new Dimension(yourChosenWidth,yourChosenHeight)) для установки панели без изменения размера.

Вы также можете использовать setMinimumSize и setMaximum size на панели, просто чтобы быть в безопасности.

Если вы чувствуете притягательность, вы можете просто использовать один единственный GroupLayout для всего, тщательно выбирая параллельные / последовательные группы и соответствующим образом группируя метки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...