Программирование на Java
Шрифт:
Такой класс называется анонимным, он не имеет своего имени. Однако правило, согласно которому компилятор всегда создает .class -файл для каждого класса Java, действует и здесь. Если внешний класс называется Test, то после компиляции появится файл Test$1.class.
Пример приложения, использующего модель событий
В заключение темы, посвященной событиям, рассмотрим пример приложения, которое активно их использует.
Попробуем написать примитивный графический редактор, который позволяет рисовать с помощью курсора – если перемещать его с нажатой кнопкой мыши, то будет появляться линия. Нажатие пробела очищает поле.
import java.awt.*;
import java.awt.event.*;
public class DrawCanvas extends Canvas {
private int lastX, lastY;
private int ex, ey;
private boolean clear=false;
public DrawCanvas {
super;
addMouseListener(new MouseAdapter {
public void mousePressed(MouseEvent e) {
lastX = e.getX;
lastY = e.getY;
}
}
);
addMouseMotionListener(new MouseMotionAdapter {
public void mouseDragged(MouseEvent e) {
ex=e.getX;
ey=e.getY;
repaint;
}
}
);
addKeyListener(new KeyAdapter {
public void keyTyped(KeyEvent e) {
if (e.getKeyChar==' ') {
clear = true; repaint;
}
}
}
);
}
public void update(Graphics g) {
if (clear) {
g.clearRect(0, 0, getWidth, getHeight);
clear = false;
}
else {
g.drawLine(lastX, lastY, ex, ey);
lastX=ex; lastY=ey;
}
}
public static void main(String s[]) {
final Frame f = new Frame("Draw");
f.addWindowListener(new WindowAdapter {
public void windowClosing(WindowEvent e) {
f.dispose;
}
}
);
f.setSize(400, 300);
final Canvas c = new DrawCanvas;
f.add(c);
f.setVisible(true);
}
}
Класс DrawCanvas
В результате можно что-нибудь нарисовать:
Апплеты
Перейдем к рассмотрению апплетов ( applets ) – Java-приложений, которые исполняются в браузере как часть HTML-страницы. Это означает, что такие приложения всегда визуальные. Действительно, класс Applet является наследником AWT-компонента Panel. Сам класс находится в пакете java.applet.
Жизненный цикл апплета
Важным вопросом для понимания работы апплетов является их жизненный цикл. Он описывается четырьмя методами.
init
Этот метод вызывается браузером при конструировании апплета. Зачастую все инициализирующие действия описываются здесь, а не в конструкторе. Это может быть, например, создание AWT-компонент, запуск потоков исполнения, установление сетевых соединений и т.д.
start
Этот метод вызывается после инициализации апплета. Он нужен по следующей причине. Апплет может содержать какие-то динамические части, например, анимацию или бегущую строку. Если пользователь воспользуется какой-нибудь ссылкой и уйдет со страницы с апплетом, браузер не станет его уничтожать – ведь пользователь может вернуться (нажав в браузере кнопку Back ), и он будет ожидать, что апплет сохранит свое состояние. Значит, апплет
Метод start сигнализирует о переходе в активное состояние.
stop
Этот метод всегда вызывается после метода start и сигнализирует о переходе в пассивное состояние.
destroy
По завершении работы апплет необходимо корректно удалить, чтобы он имел возможность освободить занимаемые ресурсы. Для этого браузер вызывает метод destroy.
В остальном апплет является полноценным AWT-компонентом и в методе init может добавить другие компоненты для создания пользовательского интерфейса, или даже открыть новый фрейм. Единственное, но существенное ограничение – это условие безопасности. Ведь код апплета скачивается по сети, а значит, может содержать в себе опасные действия. Поэтому браузер запускает виртуальную машину с ограничениями – апплетам запрещено обращаться к файловой структуре, запрещено устанавливать сетевые соединения с кем-либо, кроме сервера, откуда они были загружены, все вновь открываемые окна помечаются предупреждением. Более того, пользователь может так настроить свой браузер, что вовсе запретит исполнение Java. Можно, напротив, позволить апплетам то же, что и локальным приложениям.
Есть и еще одно ограничение – версия Java, поддерживаемая браузером. Как говорилось в первой лекции, самый популярный на данный момент браузер – MS Internet Explorer – остановился на поддержке лишь Java 1.1, и то не в полном объеме. В некоторых случаях можно воспользоваться дополнительным продуктом Sun – Java Plug-in, который позволяет установить на браузер JVM любой версии.
Продолжим рассмотрение апплетов.
HTML-тег
Раз апплет является частью HTML -страницы, значит, необходимо каким-то образом указать, где именно он располагается. Для этого служит специальный тег <applet>. Синтаксис тега <APPLET> в настоящее время таков:
<APPLET
CODE = appletFile
WIDTH = pixels
HEIGHT = pixels
[ARCHIVE = jarFiles]
[CODEBASE = codebaseURL]
[ALT = alternateText]
[NAME = appletInstanceName]
[ALIGN = alignment]
[VSPACE = pixels]
[HSPACE = pixels]
>
[HTML-текст, отображаемый при отсутствии поддержки Java]
</APPLET>
* CODE = appletClassFile; CODE – обязательный атрибут, задающий имя файла, в котором содержится описание класса апплета. Имя файла задается относительно codebase, то есть либо от текущего каталога, либо от каталога, указанного в атрибуте CODEBASE.
* WIDTH = pixels
* HEIGHT = pixels; WIDTH и HEIGHT - обязательные атрибуты, задающие размер области апплета на HTML -странице.
* ARCHIVE = jarFiles; Этот необязательный атрибут задает список jar -файлов (разделяется запятыми), которые предварительно загружаются в Web -браузер. В них могут содержаться классы, изображения, звук и любые другие ресурсы, необходимые апплету. Архивирование наиболее необходимо именно апплетам, так как их код и ресурсы передаются через сеть.
* CODEBASE = codebaseURL; CODEBASE – необязательный атрибут, задающий базовый URL кода апплета; является каталогом, в котором будет выполняться поиск исполняемого файла апплета (задаваемого в признаке CODE ). Если этот атрибут не задан, по умолчанию используется каталог данного HTML -документа. С помощью этого атрибута можно на странице одного сайта разместить апплет, находящийся на другом сайте.