Центрирование JLabel на JPanel - PullRequest
14 голосов
/ 24 августа 2011

Я использую конструктор графического интерфейса пользователя NetBeans для обработки своего макета (я ужасен с LayoutManager) и пытаюсь разместить простой JLabel так, чтобы он всегда центрировался (горизонтально) внутри родительского JPanel. В идеале, это будет соответствовать истине, даже если JPanel был изменен, но если это сумасшедший объем кода, его достаточно просто центрировать при первом создании JPanel.

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

Спасибо всем, кто может направить меня в правильном направлении!

Ответы [ 5 ]

27 голосов
/ 24 августа 2011

Вот четыре способа центрировать компонент:

4 Centered Components

import java.awt.*;
import javax.swing.*;
import javax.swing.border.*;

class CenterComponent {

    public static JLabel getLabel(String text) {
        return getLabel(text, SwingConstants.LEFT);
    }

    public static JLabel getLabel(String text, int alignment) {
        JLabel l = new JLabel(text, alignment);
        l.setBorder(new LineBorder(Color.RED, 2));
        return l;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JPanel p = new JPanel(new GridLayout(2,2,4,4));
                p.setBackground(Color.black);
                p.setBorder(new EmptyBorder(4,4,4,4));

                JPanel border = new JPanel(new BorderLayout());
                border.add(getLabel(
                    "Border", SwingConstants.CENTER), BorderLayout.CENTER);
                p.add(border);

                JPanel gridbag = new JPanel(new GridBagLayout());
                gridbag.add(getLabel("GridBag"));
                p.add(gridbag);

                JPanel grid = new JPanel(new GridLayout());
                grid.add(getLabel("Grid", SwingConstants.CENTER));
                p.add(grid);

                // from @0verbose
                JPanel box = new JPanel();
                box.setLayout(new BoxLayout(box, BoxLayout.X_AXIS ));

                box.add(Box.createHorizontalGlue());
                box.add(getLabel("Box"));
                box.add(Box.createHorizontalGlue());
                p.add(box);

                JFrame f = new JFrame("Streeeetch me..");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                f.setContentPane(p);
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        });
    }
}
12 голосов
/ 24 августа 2011

Используя Borderlayout , вы можете поместить любой из JComponents в область CENTER. Для примера см. ответ на вопрос переполнения стека Избавьтесь от разрыва между JPanels . Это должно работать.

10 голосов
/ 24 августа 2011

Даже с BoxLayout вы можете достичь этого:

JPanel listPane = new JPanel();
listPane.setLayout(new BoxLayout(listPane, BoxLayout.X_AXIS ));

JLabel label = new JLabel();
listPane.add(Box.createHorizontalGlue());
listPane.add(label);
listPane.add(Box.createHorizontalGlue());

Решение mKorbel идеально подходит для вашей цели.В любом случае, я всегда хотел бы предложить BoxLayout, потому что он очень гибкий.

6 голосов
/ 25 августа 2011

Мара: «спасибо за ваш ответ, однако сборка графического интерфейса пользователя NetBeans использует GroupLayout, и это нельзя переопределить.»

Не верно! Щелкните правой кнопкой мыши в любом месте внутри JFrame (или любого другого контейнера GUI) в построителе GUI NetBeans и выберите «Set Layout». По умолчанию выбран «Свободный дизайн», который является групповым макетом, но вы можете выбрать любой другой макет, включая макет границы, как рекомендовано mKorbel.

5 голосов
/ 24 августа 2011

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

Я считаю, что следующее будет работать независимо от менеджера компоновки:

JLabel.setHorizontalAlignment(SwingConstants.CENTER)

...