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

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

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

Назад Вперед

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).

pic1.gif (14496 bytes)

Рис. 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;
}

Назад Вперед

[Назад]