Центрирование JLabel в JPanel - PullRequest
18 голосов
/ 22 марта 2012

У меня есть панель, полученная из JPanel.У меня есть пользовательский элемент управления, полученный из JLabel.Я пытаюсь центрировать этот пользовательский JLabel на своей панели.

Единственный известный мне способ сделать это, который будет работать, - это использовать нулевой макет (setLayout(null)), а затем вычислить пользовательский JLabel's setLocation() указывает, что он находится в правильном месте.

Пользовательский JLabel физически перемещается с одной панели на эту панель в этом приложении, и я считаю, что местоположение, ранее установленное в setLocation, влияет на вещи.Однако, когда я установил (0,0), компонент поднимается в верхний левый угол.

BorderLayout не работает, потому что, когда предоставляется только 1 компонент и помещается в BorderLayout.CENTER, центральная секция расширяется, чтобы заполнить все пространство.

Пример, который я вырезал и вставилс другого сайта использованы BoxLayout и component.setAlignmentX(Component.CENTER_ALIGNMENT).Это тоже не сработало.

В другом ответе упоминалось переопределение функции getInset() панели (я думаю, что это так и называлось), но это оказалось тупиком.

Пока чтоЯ работаю с панелью с макетом GridBagLayout и включаю объект GridBagConstraints, когда вставляю пользовательский JLabel в панель.Это неэффективно, хотя.Есть ли лучший способ центрировать JLabel в моем JPanel?

Ответы [ 4 ]

33 голосов
/ 23 марта 2012

Установить GridBagLayout для JPanel , положить JLabel без каких-либо GridBagConstraints на JPanel , JLabel будет отцентрирован

enter image description here

пример

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

public class CenteredJLabel {

    private JFrame frame = new JFrame("Test");
    private JPanel panel = new JPanel();
    private JLabel label = new JLabel("CenteredJLabel");

    public CenteredJLabel() {
        panel.setLayout(new GridBagLayout());
        panel.add(label);
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.add(panel);
        frame.setSize(400, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                CenteredJLabel centeredJLabel = new CenteredJLabel();
            }
        });
    }
}
16 голосов
/ 01 мая 2014

Предположим, ваш JLabel называется label, затем используйте:

label.setHorizontalAlignment(JLabel.CENTER);
8 голосов
/ 23 марта 2012

Забудьте все LayoutManager в стандартной библиотеке Java и используйте MigLayout .По моему опыту, работать с ним намного проще, обычно он делает именно то, что вы ожидаете.

Вот как выполнить то, что вы хотите после использования MigLayout.

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import net.miginfocom.swing.MigLayout;

public class Test
{
    public static void main( String[] args )
    {
        JFrame frame = new JFrame( );
        JPanel panel = new JPanel( );

        // use MigLayout
        panel.setLayout( new MigLayout( ) );

        // add the panel to the frame
        frame.add( panel );

        // create the label
        JLabel label = new JLabel( "Text" );

        // give the label MigLayout constraints
        panel.add( label, "push, align center" );

        // show the frame
        frame.setSize( 400, 400 );
        frame.setVisible( true );
    }
}

Большая часть этогоэто просто шаблон.Ключом является ограничение макета: "push, align center":

align center указывает MigLayout поместить JLabel в центр его ячейки сетки.

push говорит MigLayout расширять ячейку сеткизаполнить доступное пространство.

8 голосов
/ 22 марта 2012

BoxLayout это путь. Если вы настроили X_AXIS BoxLayout, попробуйте добавить горизонтальные клеи до и после компонента:

panel.add(Box.createHorizontalGlue());
panel.add(label);
panel.add(Box.createHorizontalGlue());
...