Пример 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|