Назад
Вперед
7.11. Загрузка и просмотр файлов растровых
изображений
В этом разделе мы привели пример автономного
приложения Java, способного загружать и отображать
в своем окне файлы растровых графических
изображений формата GIF и GPG.
Исходный текст примера
Архив проекта для Java WorkShop 2.0
Немного теории
Работа с файлами графических изображений с
использованием стандартного программного
интерфейса Windows обычно вызывает немало
трудностей у программистов. Им приходится
вначале загружать файл изображения в память,
затем разбирать заголовки, выполнять
декомпрессию, выделять и реализовывать палитру
цветов.
Программисты, создающие автономные приложения
Java, находятся в лучшем положении - в их
распоряжении имеются удобные классы,
предназначенные для работы с файлами формата GIF и
JPG.
Если ваше приложение должно отображать в своем
окне растровые графические изображения,
находящиеся в файлах, то ему достаточно создать
объект класса Image и затем отобразить его в своем
окне стандартными методами.
Вот как можно решить первую часть этой задачи -
загрузку файла графического изображения:
String szFilename = "c:\pics\mypic.jpg";
Image img;
img = Toolkit.getDefaultToolkit().getImage(
szFilename);
Здесь мы вначале получаем ссылку на служебный
класс Toolkit, вызывая метод getDefaultToolkit, а затем
пользуемся методом getImage, определенным в этом
классе. В данном случае мы передаем этому методу
путь к локальному файлу изображения c:\pics\mypic.jpg.
Для выбора файла приложение может отобразить
стандартную диалоговую панель класса FileDialog.
Что же касается второй задачи - отображения
загруженного изображения в окне приложения, то
ее можно решить с использованием метода drawImage.
Если необходимо организовать просмотр
изображений большого размера, воспользуйтесь
классом ScrollPane. Объекты этого класса представляют
собой окна, снабженные линейками просмотра, с
помощью которых можно сдвигать изображение в
окне.
Описание примера
В главном окне нашего автономного приложения
имеется меню File, содержащее строки Open и Exit (рис. 1).
Рис. 1. Главное окно приложения
Воспользовавшись строкой Open, вы можете выбрать
и загрузить для отображения любой файл
графического изображения, имеющий формат GIF или
JPG. Соответствующая диалоговая панель выбора
файла показана на рис. 2.
Рис. 2. Диалоговая панель выбора файла для
отображения
Обратите внимание, что мы ограничили выбор
пользователя файлами типа GIF и JPG, задав
соответствующим образом содержимое поля "Имя
файла".
Рассмотрим исходный текст приложения.
Главный класс приложения
В главном классе нашего приложения мы создаем
окно класса FrameWindow и отображаем его:
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.*;
import java.applet.*;
public class ConsoleImageViewer
{
public static void main(String args[])
{
FrameWindow frame;
frame = new FrameWindow("Image Viewer");
frame.setVisible(true);
}
}
Класс FrameWindow
Класс FrameWindow определен в нашем приложении на
базе класса Frame и реализует три интерфейса:
class FrameWindow extends Frame
implements ActionListener, WindowListener,
ComponentListener
{
. . .
}
Интерфейсы ActionListener и WindowListener применяются,
соответственно, для обработки событий от меню и
события, возникающего при попытке пользователя
закрыть главное окно приложения. Интерфейс
ComponentListener нужен для отслеживания изменения
размеров главного окна.
Следующие четыре поля предусмотрены в классе
FrameWindow для хранения ссылок на меню и его строки:
MenuBar mb;
Menu mFile;
MenuItem miOpen;
MenuItem miExit;
Поле szCurrentFilename предназначено для хранения
полного пути к файлу графического изображения,
загрузенному в окно просмотра нашей программы:
String szCurrentFilename = "";
В поле sp класса ScrollPane хранится ссылка на панель,
в окне которой мы будем просматривать
графическое изображение:
ScrollPane sp;
В поле img находится ссылка на изображение:
Image img;
Это изображение рисуется в окне панели класса
imgViewer, размещенной в окне sp:
imgViewer iv;
Программа также создает объект класса MediaTracker,
предназначенный для ожидания завершения
процесса загрузки выбранного изображения:
MediaTracker mt;
Конструктор класса FrameWindow
Первым делом конструктор класса FrameWindow
устанавливает заголовок главного окна
приложения и размер этого окна:
super(szTitle);
setSize(400, 300);
Далее он формирует меню:
mb = new MenuBar();
mFile = new Menu("File");
miOpen = new MenuItem("Open...");
mFile.add(miOpen);
mFile.add("-");
miExit = new MenuItem("Exit");
mFile.add(miExit);
mb.add(mFile);
К строкам меню подключаются обработчики
событий:
miOpen.addActionListener(this);
miExit.addActionListener(this);
Затем меню устанавливается в главном окне
приложения:
setMenuBar(mb);
Последний шаг - установка обработчиков событий,
связанных с закрытием главного окна приложения и
с изменением его размеров:
this.addWindowListener(this);
this.addComponentListener(this);
Метод actionPerformed класса FrameWindow
Когда пользователь выбирает строку Open из меню
File, вызывается метод FileOpen, загружающий и
отображающий графическое изображение:
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(miOpen))
{
FileOpen();
}
else if(e.getSource().equals(miExit))
{
setVisible(false);
System.exit(0);
}
}
Выбор строки Exit из этого же меню приводит к
завершению работы приложения.
Метод FileOpen класса FrameWindow
Прежде всего метод FileOpen отображает на экране
стандартную диалоговую панель выбора файла:
FileDialog fdlg;
fdlg = new FileDialog(this, "Open file",
FileDialog.LOAD);
fdlg.setFile("*.gif;*.jpg");
fdlg.show();
Обратите внимание, что мы ограничили список
файлов, отображаемых в этой панели, указав маски
для выбора файлов методом setFile.
Полный путь к выбранному файлу мы записываем в
поле szCurrentFilename и отображаем в заголовке главного
окна приложения:
szCurrentFilename = fdlg.getDirectory() +
fdlg.getFile();
setTitle(szCurrentFilename);
На следующем шаге мы загружаем графическое
изображение из файла, формируя объект класса Image:
img = Toolkit.getDefaultToolkit().getImage(
szCurrentFilename);
Далее мы дожидаемся завершения процесса
загрузки:
mt = new MediaTracker(this);
mt.addImage(img, 0);
try
{
mt.waitForAll();
}
catch (InterruptedException ex) { }
Перед отображением содержимого загруженного
файла мы проверяем поле sp:
if(sp != null)
{
this.remove(sp);
}
Если ранее в окно приложения уже было загружено
другое изображение, мы перед загрузкой нового
удаляем из него контейнер sp класса ScrollPane.
Затем мы создаем новый контейнер и
устанавливаем его размеры равным размерам
главного окна приложения:
sp = new ScrollPane();
sp.setSize(getSize());
Созданный контейнер добавляется в окно
приложения с использованием режима размещения
компонент BorderLayout:
setLayout(new BorderLayout());
add("Center", sp);
Изображение рисуется в окне панели imgViewer,
которая создается следующим образом:
iv = new imgViewer(img,
new Dimension(img.getWidth(this),
img.getHeight(this)));
Обратите внимание, что здесь мы задаем размер
панели, равный размерам загруженного
графического изображения.
После этого панель класса imgViewer добавляется в
окно панели класса ScrollPane:
sp.add(iv);
Для правильной настройки размеров контейнеров
мы выполняем принудительное размещение
компонент, обращаясь для этого к системе Layout Manager:
sp.doLayout();
Метод componentResized класса FrameWindow
Когда пользователь изменяет размеры главного
окна приложения, метод componentResized выполняет
повторное размещение и перерисовку контейнеров
sp и iv:
public void componentResized(ComponentEvent e)
{
if(sp != null)
{
doLayout();
sp.doLayout();
sp.repaint();
iv.repaint();
}
}
Такие действия выполняются, однако, только в
том случае, если пользователь загрузил в окно
приложения какое-либо изображение для просмотра.
Метод componentShown класса FrameWindow
Метод componentShown вызывается при отображении
главного окна приложения:
public void componentShown(ComponentEvent e)
{
if(sp != null)
{
doLayout();
sp.doLayout();
sp.repaint();
iv.repaint();
}
}
У нас он выполняет те же действия, что и только
что рассмотренный метод componentResized.
Метод windowClosing класса FrameWindow
Этот метод вызывается при попытке пользователя
закрыть главное окно приложения. Наша реализация
метода завершает приложение:
public void windowClosing(WindowEvent e)
{
setVisible(false);
System.exit(0);
}
Другие методы класса FrameWindow
В классе FrameWindow определено еще несколько
методов, которые ничего не делают, но необходимы
для полноты реализации соответствующих
интерфейсов:
public void componentMoved(ComponentEvent e) {}
public void componentHidden(ComponentEvent e) {}
public void windowOpened(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowActivated(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
Класс imgViewer
Класс imgViewer создан на базе класса Panel:
class imgViewer extends Panel
{
. . .
}
Его назначение - отображение графического
изображения, ссылка на которое передается
конструктору класса.
В классе мы определили два поля:
Image im;
Dimension dimMinSize;
Первое из них хранит ссылку на изображение,
второе - размеры окна панели, передаваемое
конструктору через второй параметр.
Вот как эти поля инициализируются
конструктором:
public imgViewer(Image img, Dimension dim)
{
im = img;
dimMinSize = dim;
}
Метод paint класса imgViewer
Метод paint рисует графическое изображение в
левом верхнем углу панели:
public void paint(Graphics g)
{
g.drawImage(im, 0, 0, this);
}
Другие методы класса imgViewer
Следующие методы необходимы для правильной
работы системы размещения компонент в JDK версий
1.0 и 1.1:
public Dimension getPreferredSize()
{
return dimMinSize;
}
public Dimension getMinimumSize()
{
return dimMinSize;
}
public Dimension preferredSize()
{
return dimMinSize;
}
public Dimension minimumSize()
{
return dimMinSize;
}
Они просто возвращают размеры панели.
Назад Вперед |