Назад
Вперед
5.3. Режим BorderLayout
Пример демонстрирует использование режима
размещения BorderLayout системы Layout Manager для просмотра
графического изображения в окне аплета.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java JDK 1.1)
Немного теории
Режим BorderLayout предполагает разделение окна
контейнера на рамку и центральную часть. Методу
add при этом указывается направление от центра
окна, в котором следует размещать компоненты.
Направление указывается следующим образом:
add("Center", btn1); // центр
add("East", btn2); // восток
add("West", btn3); // запад
add("North", btn4); // север
add("South", btn5); // юг
Здесь мы добавили в окно контейнера компоненты
btn1, …, btn5. При этом компонент btn1 располагается в
центре окна контейнера, а остальные компоненты -
по бокам. Размеры компонент изменяются таким
образом, чтобы они полностью заполняли
контейнер.
Заметим, что вы не обязательно должны каждый
раз добавлять в контейнер именно пять компонент
и задействовать при этом все возможные
направления.
Описание примера
В нашем примере мы добавляем в окно аплета три
компонента. Один из них является объектом,
созданным на базе класса Canvas и служащим для
отображения растрового изображения, а два других
- стандартными полосами просмотра класса Scrollbar
(рис. 1).
Рис. 1. Окно аплета с тремя компонентами
С помощью полос просмотра вы можете сдвигать
изображение в окне, если оно не помещается там
полностью.
Рассмотрим исходный текст аплета.
Главный класс аплета
Главный класс нашего аплета BorderDemo создан на
базе класса Applet и реализует интерфейс AdjustmentListener,
необходимый для работы с полосами просмотра:
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
public class BorderDemo extends Applet
implements AdjustmentListener
{
. . .
}
В нем также определено несколько полей.
Поля scrlVert и scrlHorz хранят ссылки на полосы
просмотра:
Scrollbar scrlVert;
Scrollbar scrlHorz;
В поле pf находится ссылка на компонент,
предназначенный для отображения рисунка:
picFrame pf;
Класс picFrame определен в нашем приложении и мы
расскажем о нем позже.
Поля nVert и nHorz хранят текущие координаты,
начиная с которых компонент pf выполняет
рисование:
int nVert = 0;
int nHorz = 0;
И, наконец, поля imHeight и imWidth хранят размеры
рисунка, полученные из файла:
int imHeight;
int imWidth;
Метод init
Рассмотрим процесс инициализации аплета,
выполняемый методом init.
Прежде всего, метод загружает графическое
изображение из файла image.gif, дожидаясь завершения
этого процесса:
Image img;
MediaTracker tr = new MediaTracker(this);
img = getImage(getCodeBase(), "image.gif");
tr.addImage(img, 0);
try
{
tr.waitForAll();
}
catch (InterruptedException e) {}
Затем он определяет размеры изображения и
сохраняет их в соответствующих полях главного
класса аплета:
imHeight = img.getHeight(this);
imWidth = img.getWidth(this);
Далее метод init определяет размеры окна аплета,
сохраняя их в поле dm:
Dimension dm;
dm = getSize();
Эти размеры используются при начальной
установке диапазонов изменения значений полос
просмотра, как это показано ниже:
scrlVert = new Scrollbar(
Scrollbar.VERTICAL,
0, 10, 0, imHeight - dm.height);
scrlHorz = new Scrollbar(
Scrollbar.HORIZONTAL,
0, 10, 0, imWidth - dm.width);
Начальное значение для полос просмотра
устанавливается равным нулю (второй параметр
конструктора). Видимый размер движка мы выбрали
равным 10 пикселам.
Что же касается диапазона изменения значений,
то он простирается от нуля до разницы между
размером изображения и размером окна.
Далее мы создаем компонент класса picFrame, в окне
которого будет нарисовано изображение img:
pf = new picFrame(this, img);
Затем нужно добавить все эти компоненты в окно
аплета. Перед добавлением мы устанавливаем режим
размещения BorderLayout:
setLayout(new BorderLayout());
Далее компоненты добавляются методом add с
указанием направления от центра окна аплета:
add("Center", pf);
add("East", scrlVert);
add("South", scrlHorz);
На завершающей стадии мы регистрируем
обработчики событий для полос просмотра:
scrlVert.addAdjustmentListener(this);
scrlHorz.addAdjustmentListener(this);
Метод adjustmentValueChanged
Этот метод получает управление, когда
пользователь изменяет положение движков полос
просмотра:
public void adjustmentValueChanged(
AdjustmentEvent e)
{
Scrollbar scrl;
int nValue;
if(e.getSource() instanceof Scrollbar)
{
scrl = (Scrollbar)e.getSource();
nValue = e.getValue();
if(scrl.equals(scrlVert))
nVert = nValue;
else if(scrl.equals(scrlHorz))
nHorz = nValue;
pf.update(-nVert, -nHorz);
}
}
Получив новое текущее значение для
вертикальной или горизонтальной полосы
просмотра, метод adjustmentValueChanged передает новое
смещение изображения в окне методу update,
определенному в классе picFrame. Этот метод
перерисовывает изображение, сдвигая его в нужном
направлении.
Класс picFrame
Класс picFrame создан на базе класса Canvas:
class picFrame extends Canvas
{
. . .
}
Этот класс предназначен для рисования
графического изображения класса Image, ссылка на
которое передается конструктору в качестве
параметра.
Рассмотрим определенные в нем поля и методы.
В полях ImHeight и imWidth хранятся размеры
изображения (соответственно, высота и ширина):
int imHeight;
int imWidth;
В поле im записана ссылка на изображение:
Image im;
Поле dimMinSize предназначено для хранения
минимальных размеров окна нашего компонента:
Dimension dimMinSize;
Поля nVert и nHorz предназначены для хранения
текущих координат для рисования изображения в
окне компонента:
int nVert = 0;
int nHorz = 0;
Конструктор класса picFrame
В качестве параметров конструктору передаются
ссылки на окно контейнера и на графическое
изображение:
public picFrame(Container parent, Image img)
{
. . .
}
Конструктор сохраняет полученные параметры в
соответствующих поля класса picFrame:
Container cont;
cont = parent;
im = img;
В нашем примере мы не используем ссылку на
контейнер cont. Эта ссылка может пригодиться,
например, для получения контекста отображения
окна контейнера с целью определения метрик
шрифта.
Далее он определяет размеры изображения и
также сохраняет их:
imHeight = im.getHeight(this);
imWidth = im.getWidth(this);
Для того чтобы продемонстрировать работу полос
просмотра, мы выбираем минимальные размеры
компонента класса picFrame равными четверти от
размеров графического изображения:
dimMinSize = new Dimension(
imWidth / 4, imHeight / 4);
Метод update
Метод update вызывается при выполнении
пользователем операций с полосами просмотра:
public void update(int Vert, int Horz)
{
nVert = Vert;
nHorz = Horz;
repaint();
}
Он просто сохраняет переданные ему значения
смещения изображения и перерисовывает окно
компонента класса picFrame, вызывая для этого метод
repaint.
Метод paint
Этот метод рисует изображение с текущим
смещением:
public void paint(Graphics g)
{
g.drawImage(im, nHorz, nVert, this);
}
Другие методы класса picFrame
В классе picFrame мы определили еще несколько
методов, необходимых для того чтобы система Layout
Manager смогла правильно определить размеры нашего
компонента. Все они возвращают содержимое поля
dimMinSize:
public Dimension getPreferredSize()
{
return dimMinSize;
}
public Dimension getMinimumSize()
{
return dimMinSize;
}
public Dimension preferredSize()
{
return dimMinSize;
}
public Dimension minimumSize()
{
return dimMinSize;
}
Назад Вперед |