Использование различных макетов в графическом интерфейсе

StackOverflow https://stackoverflow.com/questions/1593085

Вопрос

Вот как должна выглядеть моя программа, и я немного не понимаю, где мне следует использовать разные макеты.

У меня есть класс Window, который вызывает класс Panel, а класс Panel вызывает классы InputPanel и DisplayPanel.Мой класс InputPanel вызывает мои классы DetailsPanel, CrimePanel и ButtonPanel, поэтому они составляют то, что отображается на вкладке «Ввод».Мне сказали использовать BorderLayout для всего окна и что DetailsPanel (левая панель) и CrimePanel должны быть GridLayout.

Означает ли это, что я должен:

  1. Поместите код BorderLayout в Panel, а код GridLayout в CrimePanel и DetailsPanel или
  2. Поместите код 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, с подробностями, преступлением и кнопкой JPanels (на западе, севере и юге соответственно), имеющие GridLayoutс.

Прежде всего вам нужно будет поместить JTabbedPane в окно, чтобы содержать две вкладки (ввод и отображение), каждая из которых состоит из JPanel.

Панель ввода можно разделить с помощью BorderLayout, как описывает Джоаннес;другой альтернативой является Групповой макет представленный в Java 6, который является очень мощным, но его сложно усвоить.Его можно использовать для размещения всей вкладки на одной панели.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top