Библиотеки обычно группируются в соответствии с их функционалом. Некоторые библиотеки, такие как те, что использовались ранее, могут быть временно отложены. Примером этого являются стандартные Java библиотеки для строк и массивов. Другие библиотеки создаются специально, например, как сборочные блоки для создания других библиотек. В некоторых библиотеках есть классы, которые служат шаблонами приложений; их цель — помочь нам создавать приложения путём предоставления классов или набора классов, которые обеспечивают базовое состояние каждого конкретного приложения. Чтобы настроить это базовое состояние для наших нужд, мы должны наследовать класс приложения и переопределить его методы. По умолчанию контрольные структуры шаблона приложения будут вызывать наши переопределённые методы в определённые моменты времени. Шаблон приложения является хорошим примером "разделения, изменения и прекращения событий", так как он всегда стремится сосредоточиться на специфических участках кода, которые были переопределены.
Апплеты используют шаблон приложения для своего создания. Мы наследуем апплеты от класса и переопределяем определённые методы. Большинство времени нам нужно учитывать важные методы, которые позволяют апплетам строиться и использоваться на веб-страницах. Эти методы включают:```markdown
init()
Вызывается при первом создании апплета для выполнения начальной инициализации апплета.
start()
Вызывается каждый раз, когда апплет становится видимым в веб-браузере, чтобы позволить апплету запустить свои обычные операции (особенно те, что выключаются методом stop()
). Также вызывается после init()
.
paint()
Частью базового класса Component
(три уровня наследования выше). Вызывается как часть метода update()
, чтобы выполнить специальное рисование на холсте апплета.
stop()
Вызывается каждый раз, когда апплет становится невидимым в веб-браузере, чтобы позволить апплету выключить дорогостоящие операции. Также вызывается сразу перед destroy()
.
destroy()
```markdown
| Метод | Действие |
|------------|-------------------------------------------------------------------------------------------|
| `init()` | Вызывается при первом создании апплета и в начале выполнения апплета |
| `start()` | Вызывается каждый раз, когда апплет становится видимым в браузере и может запустить свои обычные операции (если особый апплет был закрыт методом `stop()`); также вызывается после `init()` |
| `paint()` | Часть базового класса `Component` (наследуется через три уровня вверх по иерархии); вызывается как часть `update()`, чтобы специфически отрисовать холст апплета |
| `stop()` | Вызывается каждый раз, когда апплет выходит из поля зрения браузера, позволяя апплету завершить дорогостоящие операции; также вызывается перед `destroy()` |
| `destroy()`| Вызывается, когда апплет больше не требуется и удаляется с страницы, чтобы выполнить окончательную очистку ресурсов |
Давайте рассмотрим метод `paint()`. Когда компонент (`Component`, в данном случае это апплет) решает, что ему требуется обновление — будь то поворот экрана, первое отображение на экране или временное закрытие другим окном вашего веб-браузера, он вызывает этот метод. В этом случае апплет вызывает свой метод `update()` (определенный в базовом классе `Component`), который восстанавливает все необходимое, а вызов `paint()` является частью этого процесса.
```Перезагрузка метода `paint()` не обязательна, но создание простого апплета может быть удобным подходом, поэтому мы начинаем с метода `paint()`.При вызове `update()` метода `paint()` передается ссылка на объект `Graphics`, представляющий поверхность, которую нужно нарисовать. Это очень важно, так как внешний вид компонента ограничивает нас, и мы не можем рисовать за его пределами, что является положительной стороной, поскольку иначе мы могли бы выйти за границы области. В примере апплета внешний вид апплета определяется этой областью.
Объект графики также имеет ряд операций, которые можно выполнять над ним. Эти операции связаны с рисованием на холсте. Большинство из них относятся к рисованию изображений, геометрических фигур, дуг и т. д. (обратите внимание, если вас интересует более подробная информация, её можно найти в документации Java). Некоторые методы позволяют нам рисовать текст; наиболее часто используемый из них — `drawString()`. Для него указывается строка, которую вы хотите нарисовать, и указываются координаты начала строки на области апплета. Эти координаты указаны в пикселях, поэтому они могут различаться на разных машинах, но по крайней мере они являются переносимыми.
На основе этих данных можно создать простой апплет:
```java
//: Applet1.java
// Очень простой апплет
package c13;
import java.awt.*;
import java.applet.*;
public class Applet1 extends Applet {
public void paint(Graphics g) {
g.drawString("Первый апплет", 10, 10);
}
} ///:~
```Обратите внимание, что этому апплету не требуется метод `main()`. Все содержимое упаковано в рамках приложения; вся начальная конфигурация находится внутри метода `init()`.
Этот апплет следует поместить на веб-страницу для запуска, и эта страница должна быть доступна в веб-браузере, поддерживающем Java. Для того чтобы поместить апплет на веб-страницу, вам потребуется специальное маркерное поле (см. примечание ①) в коде веб-страницы, которое будет указывать странице загружать и запускать апплет. Это метка `applet`, которая выглядит следующим образом в `Applet1`:
```xml
<applet
code=Applet1
width=200
height=200>
</applet>
Примечание ①: В этой книге предполагается, что читатель уже знаком с основами HTML. Эти знания легко получить, так как существует множество книг и онлайн-ресурсов, которые могут помочь.
Значение атрибута code
указывает имя файла .class
, в котором находится апплет. Атрибуты width
и height
задают начальные размеры апплета (как было указано ранее, в пикселях). Также можно добавить другие значения внутри тега applet
: расположение других файлов .class
на интернете (codebase
), выравнивание и ориентацию (align
), уникальный идентификатор для связи между апплетами (name
) и параметры для передачи информации апплету. Параметры имеют следующий вид:
<param name="идентификатор" value="информация">
```Можно установить любое количество таких параметров по мере необходимости.
Для простого апплета единственное, что нам нужно сделать — это добавить тег апплета (`<applet>`) в виде веб-страницы в соответствии с вышеописанным форматом, чтобы загрузить и запустить апплет.
### 13.2.1 Тестирование апплета
Мы можем провести простой тест без создания сетевого соединения, открыв наш веб-браузер и открыв HTML-файл, содержащий тег апплета (Sun JDK также включает в себя инструмент "Обсервер апплета", который может найти тег `<applet>` в HTML-файле и запустить апплет, не показывая окружающий HTML-текст — примечание 2). После загрузки HTML-файла браузер обнаруживает тег апплета и ищет файл `.class`, указанный значением `code`. Конечно, он будет искать этот файл в пути CLASSPATH (путь к классам), если файл класса не найден в CLASSPATH, то в области состояния браузера будет отображена ошибка, сообщающая о невозможности найти файл `.class`.
2: Поскольку Обзервер апплета игнорирует всё, кроме тега `<applet>`, эти теги можно использовать как комментарии в Java-источнике:
//
```Таким образом, можно выполнить команду appletviewer MyApplet.java
непосредственно, без необходимости создания маленького HTML-файла для тестирования. Если вы хотите протестировать сайт в сети, вам придется столкнуться с рядом других проблем. Во-первых, вам нужен веб-сайт, что для большинства людей означает использование услуг провайдера интернет-доступа (ИПД) расположенного в удаленном месте. Затем необходимо каким-то образом переместить HTML-файлы и файлы `.class` со своего компьютера на правильную директорию на машине ИПД (обычно это директория WWW). Обычно это делается с помощью программы, использующей "протокол передачи файлов" (FTP), таких программ можно найти множество бесплатно в Интернете. Таким образом, все, что вам кажется необходимым сделать, — это использовать FTP для перемещения файлов на машину ИПД, а затем подключиться к сайту через свой веб-браузер; если при этом ваши скрипты правильно загружаются и выполняются, значит все получилось. Но действительно ли это так? Но здесь мы можем оказаться введены в заблуждение. Если веб-браузер не может найти файл `.class` на сервере, он будет искать его в вашей локальной машине в переменной `CLASSPATH`. Поэтому апплет может вообще не загружаться с сервера правильно, но вам это может показаться нормальным, так как браузер нашел нужный файл на вашей машине.Однако при попытке других людей получить доступ к нему, их браузеры не смогут найти эти классы. Поэтому во время тестирования важно удалить все связанные с ними `.class` файлы со своей машины, чтобы гарантировать достоверность результатов.Самый первый случай, когда я столкнулся с такой проблемой, был связан с помещением апплета в пакет (`пакет`). После загрузки HTML файла и апплета из-за ошибки в имени пакета, путь к апплету на сервере стал некорректным. Но мой браузер нашёл его в локальном пути классов (`CLASSPATH`). Таким образом, я стал единственным человеком, который смог успешно загрузить этот апплет. В конечном итоге мне потребовалось некоторое время, чтобы понять, что проблема заключалась в неверном использовании ключевого слова `package`. Обычно следует поместить объявление пакета вне класса апплета.
Этот пример не вызывает особого беспокойства, поэтому давайте попробуем добавить несколько интересных графических компонентов.
//: Applet2.java
// Легкий график
import java.awt.*;
import java.applet.*;
public class Applet2 extends Applet {
public void paint(Graphics g) {
g.drawString("Второй апплет", 10, 15);
g.draw3DRect(0, 0, 100, 20, true);
}
} ///:~
Этот апплет окружает строку текста прямоугольником. Конечно, все числа "жестко закодированы" (то есть они являются постоянными значениями внутри программы) и указаны в пикселях. Поэтому на некоторых машинах прямоугольник точно окружит текст, а на других он может быть незаметен из-за различий в используемых шрифтах.Для класса Graphics
можно найти ещё много интересного в справочной информации. Большинство операций с графикой довольно занимательны, поэтому я оставлю большую часть экспериментов вам.## 13.2.3 Демонстрация методов фрейма
Просмотр реального действия методов фрейма довольно интересен (в этом примере используются только init()
, start()
и stop()
, поскольку paint()
и destroy()
очень просты и легко понять). Этот апплет отслеживает количество вызовов этих методов и выводит их количество через paint()
:
//: Applet3.java
// Отображает активность методов init(), start() и stop()
import java.awt.*;
import java.applet.*;
Когда мы переопределяем метод, важно проверять, требуется ли нам вызвать версию этого метода из базового класса. Например, при использовании init()
, возможно, потребуется вызвать super.init()
. Однако документация по Applet
особо указывает, что методы init()
, start()
и stop()
в Applet
бесполезны, поэтому здесь нет необходимости вызывать их.
При тестировании данного фрагмента программы можно заметить, что если свернуть веб-браузер или закрыть его другим окном, то методы stop()
и start()
больше не будут вызываться (поведение может различаться в зависимости от реализации; стоит сравнить поведение веб-браузера с поведением просмотра апплета). Единственный случай, когда эти методы вызываются, это переход на другой веб-странице и последующее возвращение на страницу, содержащую апплет.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )