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

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

Оглавление
Выбор файлов
Простейший редактор текста
Копирование файлов UNICODE
Сохранение объекта Java в файле
Произвольные классы и файлы
Буферизация потоков
Разбор конфигура-
ционного файла

Работа с консолью
Работа с классом PrintWriter
Разбор строк класса String
Загрузка и просмотр изображений

Потоки в оперативной памяти
Конвейерные потоки
Комбинирование двух потоков
Комбинирование нескольких потоков
Поиск слова в текстовом файле
Произвольный доступ к файлу
Информация о файле
Работа с каталогами
Просмотр содержимого каталога
Просмотр каталога с фильтром
Панель для выбора каталога
Список системных свойств
Сохранение списка системных свойств
Контрольная сумма файла
Копирование, переименование, удаление файлов
Архивы ZIP
Создание архива ZIP
Распаковка архива ZIP
Обход дерева каталогов

Назад Вперед

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

pic1.gif (12808 bytes)

Рис. 1. Главное окно приложения

Воспользовавшись строкой Open, вы можете выбрать и загрузить для отображения любой файл графического изображения, имеющий формат GIF или JPG. Соответствующая диалоговая панель выбора файла показана на рис. 2.

pic2.gif (4946 bytes)

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

Они просто возвращают размеры панели.


Назад Вперед

[Назад]