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

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

Оглавление
Кнопки Button

Кнопки с графикой и анимацией
Кнопка в виде аплета
Переключатели класса Checkbox
Переключатели с зависимой фиксацией
Нестандартные переключатели
Списки класса Choice
Списки класса List
Поля класса Label
Поля класса TextField
Поля класса TextArea
Нестандартные текстовые поля
Кнопки и события в JDK 1.1

Линейки Scrollbar
Окно ScrollPane

Назад

3.15. Окно просмотра класса ScrollPane

В примере мы используем окно класса ScrollPane для просмотра графического изображения.

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

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

Демонстрация
(ваш браузер должен уметь работать с аплетами Java и быть совместимым с JDK 1.1)

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

В JDK версии 1.1 и 1.2 имеется контейнер класса ScrollPane, окно которого снабжено вертикальной и горизонтальной линейками просмотра (рис. 1).

pic1.gif (20843 bytes) Рис. 1. Применение контейнера ScrollPane для просмотра графического изображения

Контейнер ScrollPane можно использовать для просмотра изображений, текстовых документов или набора произвольных компонент, не помещающихся целиком в окне.

Обычно этот контейнер создается при помощи конструктора, не имеющего параметров. Однако есть и другой вариант конструктора с единственным параметром, задающим его поведение.

Если значение параметра равно SCROLLBARS_ALWAYS, контейнер снабжается линейками просмотра в любом случае, даже если его размеры равны или превышают размеры отображаемого компонента. Параметр SCROLLBARS_NEVER блокирует отображение линеек просмотра. И, наконец, параметр SCROLLBARS_AS_NEEDED указывает, что линейки просмотра необходимо показывать только тогда, когда они действительно нужны. Именно этот режим устанавливается при создании контейнера ScrollPane конструктором, не имеющим параметров.

После создания вы должны установить размеры контейнера ScrollPane методом setSize.

Далее в контейнер добавляется компонент, который будет просматриваться. Это может быть, например, компонент, созданный на базе класса Canvas или Component. Обычно размеры добавляемого компонента превышают размеры контейнера, установленные методом setSize, хотя и не обязательно, что это всегда должно быть так.

Среди методов класса ScrollPane существуют такие методы, с помощью которых можно получить доступ к линейкам просмотра, как к вертикальной, так и к горизонтальной. Есть также метод setLayout, позволяющий задать для контейнера режим работы системы Layout Manager, определяющей стратегию размещения компонент.

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

Наш пример представляет собой обычный аплет. Заметим, что этот аплет будет правильно работать только в таком браузере, который "понимает" классы JDK версии 1.1.

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

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

Этот класс создан на базе класса Applet и не имеет никаких особенностей.

В нем мы определили четыре поля:

ScrollPane sp;
Image img;
imgViewer iv;
MediaTracker mt;

Поле sp класса ScrollPane служит для хранения ссылки на контейнер, использованный нами для просмотра графического изображения. В поле img хранится ссылка на это изображение.

Поле iv хранит ссылку на объект класса imgViewer, определенный в нашем приложении. Этот класс создан на базе класса Canvas и представляет собой компонент, внутри которого мы рисуем изображение.

Объект mt класса MediaTracker служит для выполнения ожидания загрузки изображения.

Метод init главного класса

Для создания контейнера ScrollPane мы использовали вариант конструктора без параметров:

sp = new ScrollPane();

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

Размеры контейнера ScrollPane устанавливаются равными размерам окна аплета, полученным с помощью метода getSize:

sp.setSize(getSize());

Чтобы контейнер ScrollPane занял все окно аплета, мы устанавливаем режим BorderLayout системы Layout Manager и добавляем контейнер в центр окна:

setLayout(new BorderLayout());
add("Center", sp);

Далее мы создаем изображение как объект класса Image:

img = getImage(getCodeBase(), "image.gif");

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

На следующем этапе мы должны определить размеры изображения. Это можно сделать при помощи методов getWidth и getHeight из класса Image, однако здесь есть одна тонкость. Чтобы эти методы вернули правильные значения, изображение должно быть загружено полностью.

Для ожидания загрузки изображений мы воспользовались классом MediaTracker:

mt = new MediaTracker(this);
mt.addImage(img, 0);
try
{
  mt.waitForAll();
}
catch (InterruptedException ex) { }

Создав объект этого класса, мы добавили в него изображение и выполнили ожидание загрузки при помощи метода waitForAll. После завершения ожидания размеры изображения становятся доступными.

Эти размеры мы указываем конструктору класса imgViewer, созданного на базе класса Canvas:

iv = new imgViewer(img, 
  new Dimension(img.getWidth(this), 
  img.getHeight(this)));

Через первый параметр мы передали этому конструктору ссылку на графическое изображение.

Затем созданный объект добавляется в контейнер ScrollPane:

sp.add(iv);

Класс imgViewer

Как мы уже говорили, класс imgViewer создан на базе класса Canvas. В нем мы определили два поля, конструктор и несколько методов:

class imgViewer extends Canvas
{
  Image im;
  Dimension dimMinSize;
   . . .
}

В поле im хранится ссылка на графическое изображение, а в поле dimMinSize - размеры этого изображения.

Конструктор класса imgViewer просто сохраняет значения, полученные им через параметры, в перечисленных выше полях:

public imgViewer(Image img, Dimension dim)
{
  im = img;
  dimMinSize = dim;
}

Метод paint рисует графическое изображение:

public void paint(Graphics g)
{
  g.drawImage(im, 0, 0, this);
}  

Остальные методы возвращают размеры контейнера, равные размерам графического изображения, например:

public Dimension getPreferredSize()
{
  return dimMinSize;
}

Назад

[Назад]