WebClub - Всероссийский Клуб Веб-разработчиков
WebClub.RU » Архив » Использование GridBagLayout

Использование GridBagLayout


Дата публикации: 17-03-2013

До этого момента мы говорили о простых диспетчерах размещения, которые являются достаточно удобными для простых требований GUI. Однако, некоторые требования более сложны. Например, если вы хотите создать несколько строк со столбцами, имеющими различную ширину. Это именно тот случай, где выражение java.awt.GridBagLayout является действительно удобным. Хотя он несколько сложен для понимания, он стоит усилий.

GridBagLayout помещает содержащиеся компоненты в сетку ячеек. Он использует привилегированные размеры компонентов для определения размеров ячеек. Для определения размера и позиции компонентов он использует информацию, предоставляемую java.awt.GridBagConstraints. Так, все, что вы делаете - определяете ограничения для каждого компонента либо через метод setConstraints(), либо передавая их на метод add() контейнера.

Большая часть дискуссии об использовании этого диспетчера размещения фактически относится к тому, как определить ограничения. А, что является лучшим способом объяснения как не просмотр кода? Посмотрите и обратите внимание на детали следующего кода.

 

  


import java.awt.*;

/** Demonstrates the use of GridBagLayout. */
public class GridBagLayoutDemo extends Frame {

/** Initializes the demo. */
public GridBagLayoutDemo() {
super("GridBagLayout Demo");
// Initialize the UI
init();
}

/** Initializes the UI. */
public void init() {

// Set the layout
setLayout(new BorderLayout());

// Panel to hold the form components (uses GridBagLayout)
GridBagLayout gb = new GridBagLayout();
Panel componentsPanel = new Panel(gb);

// Initialize the constraints
GridBagConstraints gc = new GridBagConstraints();
gc.gridx = GridBagConstraints.RELATIVE;
gc.gridy = GridBagConstraints.RELATIVE;
gc.gridwidth = 1;
gc.gridheight = 1;
gc.fill = GridBagConstraints.BOTH;
gc.ipadx = 0;
gc.ipady = 0;
gc.insets = new Insets(2, 2, 2, 2);
gc.anchor = GridBagConstraints.CENTER;
gc.weightx = 1.0;
gc.weighty = 0.0;

// Initialize the components
Label fileLbl = new Label("File name: ");
TextField filename = new TextField(20);
Button browseButn = new Button("Browse");
Label searchForLbl = new Label("Search for: ");
TextField searchFor = new TextField(20);
Label replaceWithLbl = new Label("Replace with: ");
TextField replaceWith = new TextField(20);
Button searchButton = new Button("Search");
Button cancelButton = new Button("Cancel");

// Add the components

// Row #1

// Add the file name label in one cell
componentsPanel.add(fileLbl, gc);

// Add the textfield for filename before the last field in this row
componentsPanel.add(filename, gc);

// Add the browse button at the end of this row and keep it to its
// minimum size
gc.fill = GridBagConstraints.NONE;
gc.gridwidth = GridBagConstraints.REMAINDER;
componentsPanel.add(browseButn, gc);

// Restore the fill value
gc.fill = GridBagConstraints.BOTH;

// Row #2

// Add the search for label as the second last field
gc.gridwidth = 1;
componentsPanel.add(searchForLbl, gc);

// Add the search for textfield at the end of this row
gc.gridwidth = GridBagConstraints.REMAINDER;
componentsPanel.add(searchFor, gc);

// Row #3

// Add the replace with label as the second last field
gc.gridwidth = 1;
componentsPanel.add(replaceWithLbl, gc);

// Add the replace with textfield as the end of this row
gc.gridwidth = GridBagConstraints.REMAINDER;
componentsPanel.add(replaceWith, gc);

// A panel to hold the buttons
Panel buttonsPanel = new Panel(new FlowLayout());
buttonsPanel.add(searchButton);
buttonsPanel.add(cancelButton);

// Add the panels to the frame
add(componentsPanel, BorderLayout.CENTER);
add(buttonsPanel, BorderLayout.SOUTH);

// Do the layout
pack();

// Show
setVisible(true);

}

/** Main. */
public static void main(String[] args) {
GridBagLayoutDemo gbld = new GridBagLayoutDemo();
}

}
Это приложение подготавливает GUI поиска и перемещает утилиту, которая может заменять строку поиска строкой замены в файле. Метод main() запускается созданием образца основного класса, а конструктор вызывает метод init() для инициализации UI.
Первый шаг в инициализации UI должен установить диспетчер размещения фрейма, а затем создать и инициализировать панель компонентов. Эта панель использует GridBagLayout. Обратите внимание на то, что следующее действие - это инициализация ограничения. Хотя нет необходимости инициализировать все ограничения, это облегчает понятие программы. Теперь, давайте рассмотрим каждое ограничение:

gridx, gridy
Они определяют строку и столбец верхнего левого угла компонента с крайним левым столбцом и строкой, начинающейся в (0, 0). GridBagConstraints.RELATIVE для gridx означает движение направо от предварительно добавленного компонента. Точно так же использование этого значения для gridy означает движение ниже предыдущего компонента.

gridwidth, gridheight
Они определяют число ячеек, используемых компонентом. Назначение GridBagConstraints.REMAINDER для gridwidth заключается в том, чтобы компонент был последним в строке. Точно так же его назначение для gridheight заключается в том, чтобы компонент был последним в столбце.

fill
Он определяет то, как компонент заполняет область, когда он меньшее области дисплея. Определение значения GridBagConstraints.NONE сохраняет область такой какая она есть. Используйте GridBagConstraints.HORIZONTAL, чтобы сделать область дисплея горизонтальной, а GridBagConstraints.VERTICAL - вертикальной. Вы можете также использовать GridBagConstraints.BOTH для полного заполнения области дисплея.

ipadx, ipady
Они определяют внутреннее дополнение - то есть, сколько нужно добавить к запрошенному размеру компонента. Ширина компонента будет по крайней мере (минимальная ширина + 2 * ipadx). Умножение на 2 выполняется, потому что ipadx определяет дополнение на обоих частях - левая и правая стороны. Точно так же высота компонента будет по крайней мере (минимальная высота + 2 * ipady).

insets
Он определяет внешнее дополнение компонента - минимальное количество пробелов между компонентом и гранями области дисплея. Значение определяется, используя объект java.awt.Insets.

anchor
Он определяет направление компонента, когда он меньше области дисплея. Вы можете использовать следующие константы из GridBagConstraints: CENTER, NORTH, NORTHEAST, EAST, SOUTHEAST, SOUTH, SOUTHWEST, WEST, и NORTHWEST.

weightx, weighty
В GUI, по умолчанию, при изменении размеров, компоненты двигаются к центру. Чтобы равномерно распределить пробелы, назначьте ненулевые значения для weightx и/или weighty. Обычно, weights определяются в диапазоне от 0.0 до 1.0. Большие значения влекут за собой большее количество пробелов в столбце или строке. Например, в нашем примере, мы установили 1.0 в weightx. Так, если вы увеличиваете размер фрейма, компоненты будут занимать горизонтальный пробел вместо перемещения к центру. Однако, вертикальное пространство после изменения размеров не будут использоваться, потому что weighty - все еще 0. Эксперимент устанавливает weighty в 1.0, а затем увеличивает размер. Оправдывает ли результат ваши ожидания?

Здорово! Просто попытайтесь просмотреть все строки в методе init(). Читайте комментарии, упомянутые в коде и если требуется, обращайтесь к вышеупомянутым ограничениям. Займитесь этим и я уверен, что у вас получится. Экспериментируйте с этим кодом. Верьте мне, это поможет вам.

Поскольку мы заканчиваем наше обсуждение диспетчеров размещения, я хотел бы подчеркнуть, что перед выбором диспетчеров размещения, вам следует нарисовать ваш GUI на бумаге и попробовать визуализировать диспетчер размещения или набор диспетчеров, которые могут помочь вам достигнуть этого с минимальной сложностью кода. Другая важная вещь заключается в том, что вам нужно рассмотреть особенности изменения размеров - как ваш GUI будет реагировать на событие изменения размера? Это поможет вам понять какой диспетчер(ы) размещения лучше всего отвечают вашим потребностям. И затем, диспетчеры размещения не будут больше для вас тайной.

Популярное

Не так давно в сети появился новый сервис, под названием Dead Man Zero. Этот сервис сделал...
Рынок социальных площадок уже давно стал стабильным. Несмотря на то, что время от времени...
Artisteer 4 – единственный в своем роде продукт, позволяющий автоматизировать работу над созданием...
Март 2017 (1)
Февраль 2017 (3)
Январь 2017 (1)
Август 2016 (1)
Май 2016 (2)
Ноябрь 2015 (1)

Карта сайта: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41

Друзья сайта

Хотите продать свой сайт?
- Мы быстро и удобно для Вас сможем его купить:
  • Заявка на продажу сайта
  • Раcсматриваем цены на каждый сайт в индивидуальном порядке.

    Случайная цитата

    Боб Хейз:

    "Пятнадцать лет назад компании конкурировали друг с другом в цене. Сейчас - это качество. Завтра - это дизайн."

    Опрос

    Какой браузер Вы используете?

    Internet Explorer
    Google Chrome
    Mozilla Firefox
    Netscape Navigator
    Maxthon Browser
    Opera
    Mozilla Suite
    SeaMonkey
    K-Meleon
    Safari
    Amaya
    Avant Browser
    SlimBrowser
    Другой...