это потому, что статические поля инициализированы в том же порядке, который они определили.
Попробуйте использовать 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);
}
Во-первых, я должен упомянуть, прочтите мою статью о макетах: 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 как stuffToCenterVertical:
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(stuffToCenter);
horizontalBox.add(Box.createHorizontalGlue());
Намного легче «увидеть» в коде, чем gridbag
You can build you own LayoutManager to center a single component(both axis or just one). Here is the one which does it on both axis, you can easily change it to have vertical or horizontal centering.
The current implementation layouts first visible child, you can change that too...
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;
}
}
}
}
}
GroupLayout на самой панели с GroupLayout.Alignment.CENTER
, как для вертикального, так и для горизонтального расположения, и setPreferredSize (new Dimension (yourChosenWidth, yourChosenHeight))
, чтобы панель не изменяла размер.
Вы также можете использовать setMinimumSize и setMaximum size на панели на всякий случай.
Если вы чувствуете себя привлекательно, вы можете просто использовать один-единственный GroupLayout для всего этого, тщательно выбирая параллельные / последовательные группы и соответствующим образом группируя метки.