Центрирование JLabel на JPanel
Я использую конструктор графического интерфейса пользователя NetBeans для обработки своего макета (я ужасен с LayoutManager) и пытаюсь разместить простой JLabel так, чтобы он всегда центрировался (горизонтально) внутри родительского JPanel. В идеале, это будет соответствовать истине, даже если JPanel был изменен, но если это сумасшедший объем кода, его достаточно просто центрировать при первом создании JPanel.
Я достаточно плохо пытаюсь справиться с макетами самостоятельно, но поскольку NetBeans GUI Builder автоматически генерирует неизменный код, я не смог понять, как выполнить это центрирование, и я не смог найти в Интернете ничего, что могло бы мне помочь.
Спасибо всем, кто может направить меня в правильном направлении!
5 ответов
Используя Borderlayout, вы можете поместить любой из JComponents в область CENTER. Например, см. Ответ на вопрос переполнения стека. Избавьтесь от разрыва между JPanels. Это должно работать.
Вот четыре способа центрировать компонент:
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);
}
});
}
}
Даже с 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, потому что он очень гибкий.
Мара: "спасибо за ваш ответ, однако сборка графического интерфейса NetBeans использует GroupLayout, и это нельзя переопределить".
Не правда! Щелкните правой кнопкой мыши в любом месте внутри JFrame (или любого другого контейнера GUI) в построителе GUI NetBeans и выберите "Set Layout". По умолчанию выбран "Свободный дизайн", который является макетом группы, но вы можете выбрать любой другой макет, включая макет границы, как рекомендовано mKorbel.
Есть много способов сделать это, в зависимости от используемых вами менеджеров компоновки. Я предлагаю вам прочитать учебное пособие " Компоновка компонентов в контейнере".
Я считаю, что будет работать следующее, независимо от менеджера по расположению:
JLabel.setHorizontalAlignment(SwingConstants.CENTER)