Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Пример 1.6. Загрузка изображений




import java.net.URL;

 

public class ParamUrlImage extends Applet {

Image Im;

private String m_FileName = "simple.gif";

private final String PARAM_String_1 = "fileName";

public String[][] getParameterInfo() {

String[][] info ={{ PARAM_String_1, "fileName", "name of file" },};

return info;

}

public void init() {

String param;

param = getParameter(PARAM_String_1);

if (param!= null) m_FileName = param;

Im=getImage(getDocumentBase(),m_FileName);

resize(320, 240);

}

public void paint(Graphics g){

g.drawImage(Im,0,0,this);

g.drawString("Applet with Parameters",10, 20);}

}

Загрузить изображение можно при помощи URL-адреса на файл с изображением. URL, или Uniform Resource Locators (“унифицированная ссылка на ресурс”), - полный адрес объекта в сети WWW. В Java есть отдельный класс для обработки URL-адресов - java.net.URL. Самый простой способ создания объекта URL состоит в использовании конструктора URL(String add) с передачей ему WWW-адреса. Фрагмент кода, где происходит реализация класса URL, может сгенерировать исключение MalformedURLException, если вдруг объект не может по какой-либо причине быть создан (например, строка не является URL-адресом). Компилятор требует обработать возможность возникновения исключительной ситуации при помощи блоков try-catch, например:

try {

URL addUrl=new URL("http:// ermak.cs.nstu.ru/");

} catch(MalformedURLException e) {

// код здесь выполняется, если строка URL неправильна

}

Загружать файлы можно только с того сервера, с которого был загружен сам апплет (это хорошая практика программирования).

Для получения URL на каталог, содержащий класс работающего апплета, используется метод getDocumentBase() класса Applet. Так имя загружаемого графического файла содержится в переменной m_FileName класса, то для загрузки графического изображения можно использовать следующий фрагмент, помещаемый в метод init() класса ParamUrlImage:

Image Im;

try {

Im=getImage(getDocumentBase(), m_FileName);

} catch(MalformedURLException e) {

// код здесь выполняется, если строка URL неправильна

Im=createImage(0,0); // создание пустого изображения

}

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

Im = getToolkit().getImage(m_ FileName);

Класс Image определяет простое двумерное графическое изображение. Этот метод может импортировать изображения любого графического формата, поддерживаемого браузером (чаще всего используются форматы GIF и JPEG).

Двойная буферизация графического изображения. Для ускорения вывода картинок на экран и для устранения эффекта мерцания изображений в процессе вывода большинство апплетов использует двойную буферизацию изображения - сначала загружая изображение в оперативную память, а затем выводя его в окне апплета за один шаг.

Для того, чтобы использовать двойную буферизацию, апплет должен включать в себя метод imageUpdate(), который он использует для контроля над тем, какую часть картинки метод drawImage() загрузил в память. После того, как все изображение оказывается в памяти, программа может выводить его быстро, без искажений, которые возникают при одновременной загрузке изображения и выводе его на экран.

 

Пример 1.7. Двойная буферизация

import java.applet.Applet;

import java.awt.*;

import java.net.*;

 

public class QuickPicture extends Applet {

Image pic;

boolean picLoaded=false; // проверка загрузки изображения

private String m_FileName = "simple.gif";

private final String PARAM_String_1 = "fileName";

int x=0, y=0;

Image offScreenImage;

public void init(){

String param;

param = getParameter(PARAM_String_1);

if (param!= null) m_FileName = param;

pic=getImage(getDocumentBase(), m_FileName);

resize(320, 240);

}

public void paint (Graphics g){

// создание виртуального экрана

int width = getSize().width;

int height = getSize().height;

offScreenImage=createImage(width,height);

// получение его контекста

Graphics offScreenGraphics= offScreenImage.getGraphics();

// вывод изображения на виртуальный экран

offScreenGraphics.drawImage(pic,x,y,this);

if(picLoaded) {

// 4-м параметром в drawImage() передается null.

// Он не позволяет функции вызывать метод imageUpdate()

// в процессе вывода

g.drawImage(offScreenImage,0,0,null);

showStatus("Done");

}

else

showStatus("Loading image");

}

/* Каждый раз, когда апплет вызывает метод drawImage(), он создает поток, вызывающий методimageUpdate(), который можно переопределить в классе апплета и использовать для того, чтобы определить, какая часть изображения загружена в память.*/

 

public boolean imageUpdate(Image img, int infoflags,int x, int y,int w, int h) {

if(infoflags==ALLBITS) {

picLoaded=true; // изображение загружено полностью

repaint(); // перерисовать окно апплета

return false; // больше метод imageUpdate не вызывать

}

return true; // изображение загружено не полностью

}

}

События и их обработка

 

Событие - это информация, сгенерированная в ответ на некоторые действия пользователя (перемещение мыши, нажатие клавиши мыши или клавиши на клавиатуре). События также могут быть сгенерированы в ответ на изменение среды - к примеру, когда окно апплета заслоняется другим окном.

В современной технологии Java используется так называемое делегирование событий.

 

Апплет, обрабатывающий события. Создадим апплет Event, отображающий строку текста в месте положения щелчка мыши. Кроме того, добавим перемещение строки текста с помощью клавиш управления курсором.

 

Пример 1.8. Обработка событий от мыши и клавиатуры

import javax.swing.event.MouseInputAdapter;

import java.applet.Applet;

import java.awt.*;

import java.awt.event.*;

 

public class Event extends Applet {

int x=0, y=0;

public Event() {

// обработчик события от мыши

MouseInputAdapter pm;

pm = new MouseInputAdapter() {

public void mousePressed(MouseEvent e) {

x=e.getX(); y=e.getY();

System.out.println(x);

repaint();

}};

this.addMouseListener(pm);

// обработчик события от клавиатуры

KeyAdapter pk;

pk = new KeyAdapter(){

public void keyPressed(KeyEvent e) {

System.out.println(e);

int keyCode = e.getKeyCode();

switch(keyCode) {

case KeyEvent.VK_DOWN:

y = y + 5; repaint(); break;

case KeyEvent.VK_UP:

y = y - 5; repaint(); break;

case KeyEvent.VK_RIGHT:

x = x + 5; repaint(); break;

case KeyEvent.VK_LEFT:

x = x - 5; repaint(); break;

}

}

};

this.addKeyListener(pk);

}

public void init() { }

public void paint (Graphics g) {

g.drawString("Applet with Events",x, y);

}

}

 

Для обработки событий от кнопок мыши используется тип MouseListener. Это интерфейс. Для обработки этих событий надо, чтобы класс реализовывал указанный интерфейс, то есть в классе должны быть реализованы все методы этого интерфейса. Обработка событий от нажатия на клавиши клавиатуры выполнено также, как и от мыши, но используется другой адаптер - KeyAdapter, интерфейс (KeyListener) и метод (KeyPressed).

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...