Назад
Вперед
5.7. Инструментальная линейка
Пример демонстрирует использование режима
размещения GridBagLayout системы Layout Manager для создания
инструментальной линейки с кнопками в окне
автономного приложения Java.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
Режим GridBagLayout незаменим при создании окон
приложения с инструментальными панелями и
строками состояния, к которым привыкли
пользователи современных операционных систем с
графическим интерфейсом.
Выбрав соответствующим образом параметры
размещения компонент инструментальной линейки
(обычно такими компонентами являются кнопки), вы
можете добиться, чтобы вид линейки и взаимное
расположение ее компонент не зависел от размеров
главного окна приложения.
Описание примера
В примере автономного приложения Java мы
показываем способ размещения инструментальной
линейки и окна многострочного редактирования
текста, показанный на рис. 1.
Рис. 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);
}
Назад Вперед |