Конвертация приложений в апплеты
Оглавление
Апплет HelloWorld. 3
Конвертация приложений в апплеты.. 3
Жизненный цикл апплета. 4
Обработка событий. 5
UI-компоненты.. 6
Методы для работы с UI-компонентами. 6
Пример работы с UI-компонентом.. 7
Задание. 9
Java-апплет — это прикладная программа на Java в форме байт-кода. Java-апплеты выполняются в веб-браузере с использованием виртуальной Java машины (JVM), или в Sun's AppletViewer, автономном инструменте для тестирования апплетов. Java-апплеты были внедрены в первой версии языка Java в 1995.
Апплеты используются для предоставления интерактивных возможностей веб-приложений, которые не могут быть предоставлены HTML. Так как байт-код Java платформо-независим, то Java-апплеты могут выполняться браузерами многих платформ.
Java-апплеты в большинстве браузеров выполняются в «песочнице», предотвращая их доступ к локальным данным. Код апплета загружается с веб-сервера, и браузер либо вставляет апплет в веб-страницу, либо открывает новое окно с собственным пользовательским интерфейсом апплета. Апплет может быть отображен на веб-странице путем использования устаревшего HTML элемента applet, или рекомендуемого элемента object. Этим определяется месторасположение и источник апплета.
Главный класс апплета расширяет класс java.applet.Applet или, если создаётся Swing апплет, javax.swing.JApplet. Класс должен переопределить методы создания пользовательского интерфейса внутри себя. (Applet является потомком Panel, который, в свою очередь, является потомком Container).
Преимущества использования Java-апплетов
· кроссплатформенность
· апплет может работать на «всех» установленных к этому времени версиях Java, а не только с последней версией; однако, если апплет требует последнюю версию JRE, то клиент будет вынужден ждать более длительной загрузки;
· апплет поддерживается большинством браузеров;
· он кэшируется в большинстве браузеров, а потому будет быстро загружаться при возвращении на веб-страницу; но апплет может сохраняться в кэше и создавать проблемы после выхода новых версий;
· он может иметь полный доступ к машине, на которой выполняется, если пользователь согласен на это;
· он может запуститься с сопоставимой (но обычно медленнее) скоростью на других компилируемых языках, таких как C++, но во много раз быстрее, чем JavaScript
· он может перенести работу с сервера к клиенту, делая Интернет-решение с, большим числом пользователей / клиентов.
Java-апплет обладает следующими недостатками:
· он требует установки Java-расширения (plug-in), который не во всех браузерах доступен по умолчанию;
· реализация, принятая в Java-plug-in компании Sun, не существует для 64-разрядных процессоров;
· он не может запуститься до тех пор, пока не запустится виртуальная Java-машина, и это может занять значительное время при первом запуске;
· создание и дизайн хорошего пользовательского интерфейса с использованием апплетов считается более сложной задачей, чем с помощью технологии, основанной на HTML;
· из-за ненадежности апплета, для него существенно ограничивается доступ к пользовательской системе: в частности, он не имеет прямого доступа к диску клиента или буферу обмена;
· некоторые организации допускают только программное обеспечение, установленное администраторами. В результате многие пользователи не могут видеть апплеты по умолчанию.
· апплеты могут потребовать использования определенного JRE.
Апплет HelloWorld
import javax.swing.JApplet;
import java.awt.Graphics;
public class HelloWorld extends JApplet {
public void paint(Graphics g) {
g.drawRect(0, 0,
getSize().width - 1,
getSize().height - 1);
g.drawString("Hello world!", 5, 15);
}
}
Данный код необходимо запустить в режиме Run as Java Applet. В итоге на экране появится окно appletviewer, в котором будет написана лишь одна строчка: « Hello world!».
Если апплет использует GUI компоненты из Swing, необходимо наследование от javax.swing.JApplet.
В случае, если Swing не используется, можно наследоваться от java.applet.Applet.
Конвертация приложений в апплеты
Как нетрудно заметить, вышеизложенный код не содержит метода main. В этом апплеты значительно отличаются от обычных приложений, в которых есть, по крайней мере, один класс с методом main. Вместо этого в апплетах за время исполнения вызываются несколько разных методов.
Что нужно, чтобы превратить приложение в апплет:
· Нужно создать класс-наследник java.applet.Applet, в котором переопределить метод init, в котором проинициализировать все необходимые ресурсы (точно так же, как это происходило в методе main).
· Метод init может вызываться многократно (в отличие от метода main), следует учесть это при его проектировании. + Panel (если используется таковая) на вершине иерархии должна добавляться в апплет в методе init (так же как это обычно происходило в методе main).
Вот и всё!
Замечания:
· Класс апплета объявлен как public (чтобы appletviewer имел к нему доступ).
· Апплет наследуется от Applet/JApplet, а приложение от Frame/JFrame.
· У апплета нет метода main.
· В апплете конструктор заменен методами start and init methods.
· GUI компоненты добавляются напрямую в Applet, в то время как в случае с обычным приложением эти компоненты добавляются в content JFrame'a.
Жизненный цикл апплета
import java.applet.Applet;
import java.awt.Graphics;
// Нет необходимости наследовать от JApplet, т.к. компоненты не добавляются —
// проиcходит просто отрисовка
public class Simple extends Applet {
StringBuffer buffer;
public void init() {
buffer = new StringBuffer();
addItem("initializing... ");
}
public void start() {
addItem("starting... ");
}
public void stop() {
addItem("stopping... ");
}
public void destroy() {
addItem("preparing for unloading...");
}
private void addItem(String newWord) {
System.out.println(newWord);
buffer.append(newWord);
repaint();
}
public void paint(Graphics g) {
// Рисуем прямоугольник
g.drawRect(0, 0,
getWidth() - 1,
getHeight() - 1);
// Отрисовываем строчку внутри прямоугольника
g.drawString(buffer.toString(), 5, 15);
}
}
Таким образом, апплет может:
· Инициализировать себя (метод init).
· Начать работу (метод start).
· Перестать работать (метод stop). Происходит, когда пользователь открывает другую страницу. Если же он возращается назад выполняется метод start.
· Произвести финальную очистку данных перед тем как выгрузиться (cначала выполняется метод stop, потом destroy). Происходит, к примеру, при перезагрузке апплета (обновлении страницы).
При этом совсем не обязательно, чтобы программист переопределял сразу все эти методы.
Обработка событий
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.applet.Applet;
import java.awt.Graphics;
// Нет необходимости наследовать от JApplet, т.к. компоненты не добавляются —
// проиcходит просто отрисовка
public class SimpleClick extends Applet
implements MouseListener {
StringBuffer buffer;
public void init() {
addMouseListener(this);
buffer = new StringBuffer();
addItem("initializing... ");
}
public void start() {
addItem("starting... ");
}
public void stop() {
addItem("stopping... ");
}
public void destroy() {
addItem("preparing for unloading...");
}
void addItem(String newWord) {
System.out.println(newWord);
buffer.append(newWord);
repaint();
}
public void paint(Graphics g) {
// Рисуем прямоугольник
g.drawRect(0, 0,
getWidth() - 1,
getHeight() - 1);
// Отрисовываем строчку внутри прямоугольника
g.drawString(buffer.toString(), 5, 15);
}
// Следующая группы пустых методов может быть удалена в случае реализации
// MouseAdapter
public void mouseEntered(MouseEvent event) {
}
public void mouseExited(MouseEvent event) {
}
public void mousePressed(MouseEvent event) {
}
public void mouseReleased(MouseEvent event) {
}
public void mouseClicked(MouseEvent event) {
addItem("click!... ");
}
}
Как видно, нет никаких разительных отличий обработки событий от обычных приложений. При нажатии кнопкой мыши, появиться надпись «click!... ».
UI-компоненты
· Buttons (javax.swing.JButton)
· Checkboxes (javax.swing.JCheckBox)
· Single-line text fields (javax.swing.JTextField)
· Larger text display and editing areas (javax.swing.JTextArea)
· Labels (javax.swing.JLabel)
· Lists (javax.swing.JList)
· Pop-ups (javax.swing.Popup)
· Scrollbars (javax.swing.JScrollBar)
· Sliders (javax.swing.JSlider)
· Drawing areas (java.awt.Canvas)
· Menus (javax.swing.JMenu,javax.swing.JMenuBar javax.swing.JMenuItem, javax.swing.JCheckBoxMenuItem)
· Containers (javax.swing.JPanel, javax.swing.JWindow and its subclasses)