Использование различных макетов в графическом интерфейсе
-
22-09-2019 - |
Вопрос
Вот как должна выглядеть моя программа, и я немного не понимаю, где мне следует использовать разные макеты.
У меня есть класс Window, который вызывает класс Panel, а класс Panel вызывает классы InputPanel и DisplayPanel.Мой класс InputPanel вызывает мои классы DetailsPanel, CrimePanel и ButtonPanel, поэтому они составляют то, что отображается на вкладке «Ввод».Мне сказали использовать BorderLayout для всего окна и что DetailsPanel (левая панель) и CrimePanel должны быть GridLayout.
Означает ли это, что я должен:
- Поместите код BorderLayout в Panel, а код GridLayout в CrimePanel и DetailsPanel или
- Поместите код BorderLayout в Window и код GridLayout в Panel?
альтернативный текст http://img137.imageshack.us/img137/6422/93381955.jpg
Решение
Хорошо, ваше описание немного сбивает с толку (или я все еще слишком устал сегодня, или мне еще не хватило кофеина).Ваше представление о «вызове» панельных классов у других также немного странно.
Но насколько я понимаю, ваш первый вариант правильный.
Обычно вы просто вкладываете объекты во время выполнения, поэтому это может выглядеть примерно так:
InputPanel (has BorderLayout)
+--DetailsPanel (put in BorderLayout.WEST; has GridLayout)
| +--nameLabel
| +--nameTextField
| +--...
+--CrimePanel (put in BorderLayout.NORTH; has GridLayout)
| +--murderRadioButton
| +--arsonRadioButton
| +--...
+--ButtonPanel (put in BorderLayout.CENTER; has GridLayout)
+--button
Обычно вы делаете это в конструкторе соответствующего класса:
public class InputPanel {
public InputPanel() {
this.setLayout(new BorderLayout());
this.add(new DetailsPanel(), BorderLayout.WEST);
this.add(new CrimePanel(), BorderLayout.NORTH);
this.add(new ButtonPanel(), BorderLayout.CENTER);
}
}
public class DetailsPanel {
JLabel nameLabel;
JTextField nameField;
// ...
public DetailsPanel() {
this.setLayout(new GridLayout(5, 1));
nameLabel = new JLabel("Name");
nameField = new JTextField();
// ...
this.add(nameLabel);
this.add(nameField);
// ...
}
}
...
Однако я вижу здесь небольшую проблему:С GridLayout
не позволяет компонентам охватывать несколько столбцов, вам может потребоваться вложить другие панели в DetailsPanel
слева тоже.Вы можете уйти с помощью одного GridBagLayout
который имеет необходимые возможности, или вы вкладываете туда другие панели:
DetailsPanel (has BorderLayout)
+--panel1 (has GridLayout with 2 rows, 1 column; put in BorderLayout.NORTH)
| +--nameLabel
| +--nameField
+--panel2 (has GridLayout with 3 rows, 2 columns; put in BorderLayout.CENTER)
+--dayField
+--dayLabel
+--monthField
+--...
Другие советы
Судя по вашему описанию, вариант 1 должен работать.Введите данные JPanel
а BorderLayout
, с подробностями, преступлением и кнопкой JPanel
s (на западе, севере и юге соответственно), имеющие GridLayout
с.
Прежде всего вам нужно будет поместить JTabbedPane в окно, чтобы содержать две вкладки (ввод и отображение), каждая из которых состоит из JPanel.
Панель ввода можно разделить с помощью BorderLayout, как описывает Джоаннес;другой альтернативой является Групповой макет представленный в Java 6, который является очень мощным, но его сложно усвоить.Его можно использовать для размещения всей вкладки на одной панели.