Чтобы получить представление о макетах, я бы порекомендовал прочитать о них мою статью (http://java.sun.com/developer/onlineTraining/GUI/AWTLayoutMgr/). Это старая версия, но концепции и принципы работы FlowLayout подробно описаны.
Что вы подразумеваете под "друг на друга"?
Если вы имеете в виду, как
Password
<field>
РЕДАКТИРОВАТЬ: Я вспомнил более простой способ сделать это (полностью в JDK / JRE) ...
(Это похоже на то, что я делаю с BoxBeans ниже, но вам не нужны BoxBeans. Я создал BoxBeans, чтобы давным-давно использовать BoxLayout в построителе пользовательского интерфейса ...)
JLabel label = new JLabel("Password") {
@Override public Dimension getMaximumSize() {
return super.getPreferredSize();
}
};
JPasswordField field = new JPasswordField() {
@Override public Dimension getMaximumSize() {
return super.getPreferredSize();
}
};
field.setColumns(10);
Box verticalBox = Box.createVerticalBox();
verticalBox.add(Box.createVerticalGlue());
verticalBox.add(label);
verticalBox.add(field);
verticalBox.add(Box.createVerticalGlue());
//
Box horizontalBox = Box.createHorizontalBox();
horizontalBox.add(Box.createHorizontalGlue());
horizontalBox.add(verticalBox);
horizontalBox.add(Box.createHorizontalGlue());
add(horizontalBox);
Предыдущий ответ для справки ...
Я НЕ РЕКОМЕНДУЮ СЛЕДУЮЩЕГО, НО ЭТО МОЖЕТ ПОМОЧЬ ДРУГИМ ЧИТАТЕЛЯМ ИДЕЯМИ
Вы можете сделать что-то вроде
setLayout(FlowLayout());
JPanel group = new JPanel(new BorderLayout());
group.add(new JLabel("Password"), BorderLayout.NORTH);
group.add(passwordField, BorderLayout.SOUTH);
add(group);
Это создаст небольшую панель в верхнем центре общего пользовательского интерфейса, которая содержит пароль и поле.
Обратите внимание, что вложенный BorderLayout гарантирует, что метка и поле каждый получит свой предпочтительный размер. Вам нужно будет вызывать setColumns для поля с тем количеством символов, которое вы хотите отобразить.
Если вы также хотите расположить метку / поле по вертикали, вы можете сделать следующее
setLayout(new GridBagLayout());
//
add(new JLabel("Password"),
new GridBagConstraints(0,0,1,1,1,1,
GridBagConstraints.SOUTH,GridBagConstraints.NONE,
new Insets(3,3,3,3), 0,0));
field.setColumns(10);
add(field, new GridBagConstraints(0,1,1,1,1,1,
GridBagConstraints.NORTH,GridBagConstraints.NONE,
new Insets(3,3,3,3), 0,0));
Мне вообще не нравится использовать GridBagLayout, поэтому я добавлю версию с помощью BoxLayout (но это немного сложнее из-за предпочтительных настроек размера)
JFrame f = new JFrame();
f.setLayout(new BorderLayout());
//
JPanel stuffH = new JPanel();
f.add(stuffH, BorderLayout.CENTER);
stuffH.setLayout(new BoxLayout(stuffH, BoxLayout.X_AXIS));
//
JPanel stuffV = new JPanel();
stuffV.setLayout(new BoxLayout(stuffV, BoxLayout.Y_AXIS));
//
JLabel label = new JLabel("Password");
BoxAdapter labelAdapter = new BoxAdapter();
labelAdapter.add(label);
JPasswordField field = new JPasswordField();
field.setColumns(10);
BoxAdapter fieldAdapter = new BoxAdapter();
fieldAdapter.add(field);
//
stuffV.add(new VerticalGlue()); // for vertical spacing
stuffV.add(labelAdapter);
stuffV.add(fieldAdapter);
stuffV.add(new VerticalGlue()); // for vertical spacing
//
stuffH.add(new HorizontalGlue()); // for horizontal spacing
stuffH.add(stuffV);
stuffH.add(new HorizontalGlue()); // for horizontal spacing
//
f.setVisible(true);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Несколько замечаний по этому поводу:
- Я использую свои вспомогательные классы BoxBeans - см. http://javadude.com/tools/boxbeans. Эта страница основана на VisualAge для Java, но банку внизу страницы можно использовать за пределами VAJ. Я просто попробовал, например, в Eclipse.
- AFAICS, вы не можете установить макет jframe непосредственно в BoxLayout, поэтому я добавил дополнительную панель между ними. В BoxLayout есть проверка, которая имеет проблемы с автоматическим перенаправлением панели содержимого.
- Я вложил BoxLayouts, чтобы было горизонтальное центрирование (панель stuffH), содержащее вертикальное центрирование (панель stuffV). Они сосредоточены, окружая их компонентами «Клея», которые являются просто компонентами, которые позволяют себе расширяться.
Мне пришлось поместить метку и поле в BoxAdapter, который ограничивает их максимальный размер до их предпочтительного размера. Если вы не хотите использовать BoxAdapter, вы можете добиться того же эффекта, используя следующее для поля и метки:
JLabel label = new JLabel("Password") {
@Override public Dimension getMaximumSize() {
return super.getPreferredSize();
}
};
JPasswordField field = new JPasswordField() {
@Override public Dimension getMaximumSize() {
return super.getPreferredSize();
}
};
Надеюсь, это окажется полезным для вас и всех остальных!
- Скотт