Электронная библиотека книг Александра Фролова и Григория Фролова.
Shop2You.ru Создайте свой интернет-магазин
Библиотека
Братьев
Фроловых
[Назад]

Библиотека примеров приложений Java

Оглавление
Режим FlowLayout
Режим GridLayout
Режим BorderLayout
Режим CardLayout
GridBagLayout -  пример 1
GridBagLayout - заполнение формы
Инструментальная линейка
Панели
Точное размещение компонент
Прилипчивая кнопка

Назад Вперед

5.7. Инструментальная линейка

Пример демонстрирует использование режима размещения GridBagLayout системы Layout Manager для создания инструментальной линейки с кнопками в окне автономного приложения Java.

Исходный текст примера

Архив проекта для Java WorkShop 2.0

Немного теории

Режим GridBagLayout незаменим при создании окон приложения с инструментальными панелями и строками состояния, к которым привыкли пользователи современных операционных систем с графическим интерфейсом.

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

Описание примера

В примере автономного приложения Java мы показываем способ размещения инструментальной линейки и окна многострочного редактирования текста, показанный на рис. 1.

pic1.gif (3593 bytes)

Рис. 1. Главное окно приложения Java с инструментальной линейкой

Рассмотрим исходный текст этого приложения.

Главный класс приложения

В главном классе приложения определен статический метод main, который создает окно приложения на базе класса FrameWindow (определенного в нашем приложении) и отображает его:

import java.awt.*;
import java.awt.event.*;

public class GridBagConsole
{
  public static void main(String args[])
  {
    FrameWindow frame;
    frame = 
      new FrameWindow("Application window");
    frame.setVisible(true);
  }
}

Класс FrameWindow

Этот класс определяет поведение главного окна нашего приложения. Он создан на базе класса Frame и реализует два интерфейса - ActionListener и WindowListener:

class FrameWindow extends Frame
  implements ActionListener, WindowListener
{
  . . .
}

Первый из них нужен для обработки событий от кнопок инструментальной линейки, а второй - для обработки события, связанного с закрытием главного окна приложения.

Следующие поля класса FrameWindow хранят ссылки на кнопки инструментальной линейки:

Button btOpen;
Button btClose;
Button btExit;
Button btAbout;

Практически всю поверхность главного окна приложения занимает многострочный редактор текста, ссылка на который хранится в поле ta:

TextArea ta;

В классе FrameWindow мы также определили поля для хранения ссылок на главное меню и меню второго уровня:

MenuBar mb;
  
Menu mFile;
MenuItem miOpen;
MenuItem miClose;
MenuItem miExit;
  
Menu mHelp;
MenuItem miAbout;
Конструктор класса FrameWindow

Получив управление, конструктор класса FrameWindow вызывает конструктор базового класса, передавая ему заголовок окна, а затем устанавливает начальные размеры окна:

super(szTitle);
setSize(400, 300);

Далее конструктор формирует главное меню нашего приложения:

mb = new MenuBar();
mFile = new Menu("File");
mHelp = new Menu("Help");
    
miOpen = new MenuItem("Open...");
mFile.add(miOpen);
    
miClose = new MenuItem("Close");
mFile.add(miClose);
    
mFile.add("-");
    
miExit = new MenuItem("Exit");
mFile.add(miExit);
    
miAbout = new MenuItem("About...");
mHelp.add(miAbout);
    
mb.add(mFile);
mb.add(mHelp);

Для каждой строки меню мы регистрируем обработчики событий, вызывая метод addActionListener:

miOpen.addActionListener(this);
miClose.addActionListener(this);
miExit.addActionListener(this);
miAbout.addActionListener(this);

Сформированное меню устанавливается в окне приложения:

setMenuBar(mb);

Далее мы регистрируем обработчик события, связанный с закрытием окна:

this.addWindowListener(this);

Теперь мы переходим к самому интересному - формированию инструментальной линейки.

Кнопки инструментальной линейки создаются обычным образом при помощи соответствующих конструкторов:

btOpen = new Button("Open");
btClose = new Button("Close");
btExit = new Button("Exit");
btAbout = new Button("About");

Для этих кнопок мы регистрируем обработчики событий:

btOpen.addActionListener(this);
btClose.addActionListener(this);
btExit.addActionListener(this);
btAbout.addActionListener(this);

Далее мы создаем многострочный редактор текста:

ta = new TextArea(10, 30);

Следующие строки устанавливают режим размещения компонент GridBagLayout:

GridBagLayout gbl = new GridBagLayout();
GridBagConstraints c = 
  new GridBagConstraints();
    
setLayout(gbl);

Теперь мы приступаем к определению параметров расположения кнопок инструментальной линейки.

Для первой кнопки параметры таковы:

c.anchor = GridBagConstraints.NORTHWEST; 
c.fill   = GridBagConstraints.NONE;  
c.gridheight = 1;
c.gridwidth  = 1;
c.gridx = GridBagConstraints.RELATIVE; 
c.gridy = GridBagConstraints.RELATIVE; 
c.insets = new Insets(0, 0, 0, 0);
    
gbl.setConstraints(btOpen, c);
add(btOpen);

Следующие две кнопки добавляются с точно такими же параметрами, что и первая:

gbl.setConstraints(btClose, c);
add(btClose);
    
gbl.setConstraints(btExit, c);
add(btExit);

При добавлении последней кнопки мы указываем, что она должна занимать всю оставшуюся часть первой строки:

c.gridwidth  = GridBagConstraints.REMAINDER;
c.weightx = 1.0;
gbl.setConstraints(btAbout, c);
add(btAbout);

Этого мы добиваемся, устанавливая соответствующим образом параметры gridwidth и weightx.

Что же касается редактора текста, то он занимает всю вторую строку и его размеры автоматически изменяются в зависимости от выделенного пространства:

c.gridwidth  = GridBagConstraints.REMAINDER;
c.weighty = 1.0;
c.fill = GridBagConstraints.BOTH;
gbl.setConstraints(ta, c);
add(ta);
Метод actionPerformed

Определив, какая из кнопок инструментальной линейки была нажата, метод actionPerformed добавляет название кнопки в окно многострочного редактора текста. Вот как это делается для кнопки Open:

if(e.getSource().equals(btOpen))
{
  ta.append("Open\n");
}

Если пользователь выбрал строку меню, соответствующую кнопке Open, то выполняется аналогичная операция. К названию кнопки в этом случае в скобках добавляется слово menu:

else if(e.getSource().equals(miOpen))
{
  ta.append("Open (menu)\n");
}

События от остальных кнопок и строк меню, кроме кнопки Exit, обрабатываются аналогично.

Что же касается кнопки Exit и строки Exit меню File, то соответствующий обработчик скрывает окно приложения и завершает его работу:

else if(e.getSource().equals(btExit) ||
  e.getSource().equals(miExit))
{
  setVisible(false);
  System.exit(0);
}
Метод windowClosing

Этот метод получает управление, когда пользователь закрывает окно приложения. Его задача - скрытие окна приложения и завершение его работы:

public void windowClosing(WindowEvent e)
{
  setVisible(false);
  System.exit(0);
}

Назад Вперед

[Назад]