1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/wizardforcel-thinking-in-java-zh

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
13.2 基本程序片.md 20 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 11.03.2025 09:15 d56454c

13.2 Базовые апплеты

Библиотеки обычно группируются в соответствии с их функционалом. Некоторые библиотеки, такие как те, что использовались ранее, могут быть временно отложены. Примером этого являются стандартные 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`. Обычно следует поместить объявление пакета вне класса апплета.

13.2.2 Пример с более графическим интерфейсом

Этот пример не вызывает особого беспокойства, поэтому давайте попробуем добавить несколько интересных графических компонентов.

//: 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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/wizardforcel-thinking-in-java-zh.git
git@api.gitlife.ru:oschina-mirror/wizardforcel-thinking-in-java-zh.git
oschina-mirror
wizardforcel-thinking-in-java-zh
wizardforcel-thinking-in-java-zh
master