Назад
3.15. Окно просмотра класса ScrollPane
В примере мы используем окно класса ScrollPane для
просмотра графического изображения.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Демонстрация
(ваш браузер должен уметь работать с аплетами
Java и быть совместимым с JDK 1.1)
Немного теории
В JDK версии 1.1 и 1.2 имеется контейнер класса
ScrollPane, окно которого снабжено вертикальной и
горизонтальной линейками просмотра (рис. 1).
|
Рис. 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;
}
Назад |