appletviewer — Средство просмотра Апплета Java
appletviewer команда соединяется с документами или ресурсами, определяемыми URL, и выводит на экран каждый апплет, на который ссылаются документы в его собственном окне. Отметьте: если документы, упомянутые URL, не ссылаются ни на какие апплеты с ОБЪЕКТОМ, ВСТРАИВАЮТ, или тег АППЛЕТА, то appletviewer ничего не делает. Для получения дополнительной информации на HTML-тэгах, которые поддерживает appletviewer, см. Теги AppletViewer.
Отметьте: appletviewer предназначается в целях разработки только. Займитесь Выборкой / Тестовые Приложения и Код для получения дополнительной информации.
Java 2 JDK содержит две реализации виртуальной машины Java:
Отметьте: appletviewer требует, закодировал URL согласно механизму выхода, определенному в RFC2396. Только закодированные URL поддерживаются. Однако, имена файлов должны быть незакодированы, как определено в RFC2396.
appletviewer
Note: You use the appletviewer command to launch the AppletViewer and run applets outside of a web browser. Although available and supported in JDK 9, the Applet API is marked as deprecated in preparation for removal in a future release. Instead of applets, consider alternatives such as Java Web Start or self-contained applications.
Specifies the command-line options separated by spaces. See Options for appletviewer .
Specifies the location of the documents or resources to be displayed. You can specify multiple URLs separated by spaces.
The appletviewer command connects to the documents or resources designated by url and displays each applet referenced by the documents in its own AppletViewer window. If the documents referred to by url don’t reference any applets with the OBJECT , EMBED , or APPLET tag, then the appletviewer command does nothing. The OBJECT , EMBED , and APPLET tags are described in AppletViewer Tags.
The appletviewer command requires encoded URLs according to the escaping mechanism defined in RFC2396. Only encoded URLs are supported. However, file names must be unencoded, as specified in RFC2396.
The appletviewer command is intended for development purposes only.
Options for appletviewer
Specifies the input HTML file encoding name.
Passes the string javaoption as a single argument to the Java interpreter, which runs the AppletViewer. The argument shouldn’t contain spaces. Multiple argument words must all begin with the prefix -J . This is useful for adjusting the compiler’s execution environment or memory usage. Seejava command documentation for more information about JVM options.
AppletViewer Tags
The AppletViewer makes it possible to run a Java applet without using a browser.
The AppletViewer ignores any HTML that isn’t immediately relevant to launching an applet. However, it recognizes a wide variety of applet-launching syntax. The HTML code that the AppletViewer recognizes is described in this section. All other HTML code is ignored.
The object tag is the HTML 4.0 tag for embedding applets and multmedia objects into an HTML page. It’s also an Internet Explorer 4.n extension to HTML 3.2 which enables IE to run a Java applet using the latest Java plug-in.
The AppletViewer ignores the classID attribute, on the assumption that it’spointing to the Java plug-in, with the value:
The AppletViewer also ignores the codebase attribute that’s usually included as part of the object tag, assuming that it points to a Java plug-in in a network cab file with a value like:
The optional codebase parameter tag supplies a relative URL that specifies the location of the applet class.
Either code or object is specified, not both.
The type parameter tag isn’t used by AppletViewer, but should be present so that browsers load the plug-in properly. For an applet, the value should be similar to:
For a serialized object or JavaBean, the type parameter value should be similar to:
Other parameter tags are argument values supplied to the applet.
The object tag recognized by IE4.n and the embed tag recognized by Netscape 4.n can be combined so that an applet can use the latest Java plug-in, regardless of the browser that downloads the applet.
The AppletViewer doesn’t recognize the java_code , java_codebase , java_object , or java_type param tags. These tags are needed only when the applet defines parameters with the names code , codebase , object , or type , respectively. In that situation, the plug-in recognizes and uses the java_ version option in preference to the version is be used by the applet. If the applet requires a parameter with one of these four names, then it might not run in the AppletViewer.
The embed tag is the Netscape extension to HTML 3.2 that allows embedding an applet or a multimedia object in an HTML page. It allows a Netscape 4.n browser (which supports HTML 3.2) to run a Java applet using the Java plug-in.
The object and embed tags can be combined so that an applet can use the latest Java plug-in, regardless of the browser that downloads the applet.
Unlike the object tag, all values specified in an embed tag are attributes (part of the tag) rather than parameters (between the start tag and end tag), specified with a param tag.
To supply argument values for applet parameters, you add additional attributes to the embed tag.
The AppletViewer ignores the src attribute that’s usually part of an embed tag.
Either code or object is specified, not both.
The optional codebase attribute supplies a relative URL that specifies the location of the applet class.
The type attribute isn’t used by the AppletViewer, but should be present so that browsers load the plug-in properly.
For an applet, the value should be similar to:
For a serialized object or JavaBean, the type parameter value should be similar to:
The pluginspage attribute isn’t used by the AppletViewer, but should be present so that browsers load the plug-in properly. It should point to a Java plug-in in a network cab file with a value like:
The applet tag is the original HTML 3.2 tag for embedding an applet in an HTML page. Applets loaded using the applet tag are run by the browser, which may not be using the latest version of the Java platform. To ensure that the applet runs with the latest version, use the object tag to load the Java plug-in into the browser. The plug-in then runs the applet.
Either code or object is specified, not both.
The optional codebase attribute supplies a relative URL that specifies the location of the applet class.
The param tags supply argument values for applet parameters.
The app tag was a short-lived abbreviation for applet that’s no longer supported. The AppletViewer translates the tag and prints an equivalent tag that’s supported.
Java/Запуск программы
Загрузка и установка пакета SDK или пакета JDK [ править ]
1. Загрузите нужную версию JDK компании Oracle Corporation (ранее Sun Microsystems) или последнюю версию SDK («Набор программиста») компании Sun Microsystems.
2. Установите её, следуя указаниям.
Подготовка пакета SDK или пакета JDK к работе [ править ]
Открытие окна системного ввода-вывода [ править ]
3. Теперь откройте окно «Командная строка» или окно «C:\windows\system32\cmd.exe«.
3.1. Открытие окна «Командная строка«:
3.1.1. Кликните левой кнопкой мыши на кнопке «Пуск»
3.1.2. В открывшемся меню первого уровня выберите строку «Все программы»
3.1.3. В открывшемся меню второго уровня выберите строку «Стандартные»
3.1.4. В открывшемся меню третьего уровня выберите строку «Командная строка» и кликните на ней левой кнопкой мыши, откроется окно «Командная строка» системного вывода-ввода с сообщениями:
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>_
, где «2» — имя пользователя.
3.2. Открытие окна «C:\windows\system32\cmd.exe«:
3.2.1. Открытие окна «C:\windows\system32\cmd.exe«. Способ 1.:
3.2.1.1. Кликните левой кнопкой мыши на кнопке «Пуск«, откроется окно «Запуск программы»
3.2.1.2. В открывшемся меню первого уровня выберите строку «Выполнить» и кликните на ней левой кнопкой мыши, откроется окно «Запуск программы»
3.2.1.3. В окне «Запуск программы«, в строке «Открыть:» введите cmd<OK>, откроется окно «C:\windows\system32\cmd.exe» системного вывода-ввода с сообщениями:
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>_
3.2.2. Открытие окна «C:\windows\system32\cmd.exe«. Способ 2.:
3.2.2.1. Нажмите одновременно две кнопки Win+R, откроется окно «Запуск программы»
3.2.2.2. В окне «Запуск программы«, в строке «Открыть:» введите cmd<OK>, откроется окно «C:\windows\system32\cmd.exe» системного вывода-ввода с сообщениями:
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>_
Указание пути к папке bin [ править ]
4. Для удобства пропишите в path путь к папке bin пакета SDK или JDK, для этого введите системную команду с указанием пути к папке bin, например:
path c:\Program Files\Java\jdk1.7.0\bin
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>path c:\Program Files\Java\jdk1.7.0\bin
C:\Documents and Settings\2>_
Вход в папку с исходным Java-кодом [ править ]
5. Зайдите в папку с исходными кодами, для этого введите системную команду перехода к другому подкаталогу CD с указанием пути к подкаталогу с файлом исходного кода, например:
cd c:\Documents and Settings\2\Мои документы\Java\HelloWorld
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>path c:\Program Files\Java\jdk1.7.0\bin
C:\Documents and Settings\2>cd c:\Documents and Settings\2\Мои документы\Java\HelloWorld
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>_
Компиляция исходного Java-кода в байт-код [ править ]
6. Компилируйте файлы *.java, получая *.class. Например: javac MyTest.java или javac HelloWorld.java
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>path c:\Program Files\Java\jdk1.7.0\bin
C:\Documents and Settings\2>cd c:\Documents and Settings\2\Мои документы\Java\HelloWorld
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>javac HelloWorld.java
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>_
Запуск байт-кода [ править ]
7. Запустите класс, где есть функция public static void main(…) . Например: java -cp . MyTest или java HelloWorld
Microsoft Windows XP [Версия 5.1.2600]
(C) Корпорация Майкрософт, 1985-2001.
C:\Documents and Settings\2>path c:\Program Files\Java\jdk1.7.0\bin
C:\Documents and Settings\2>cd c:\Documents and Settings\2\Мои документы\Java\HelloWorld
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>javac HelloWorld.java
C:\Documents and Settings\2\Мои документы\Java\HelloWorld>java HelloWorld
HelloWorld!
C:\Documents and Settings\2\Мои документы\Java\JavaShildt\HelloWorld>_
Appletviewer java как запустить
Апплеты, события и прочее
Основные навыки и понятия
- Представление об апплетах
- Архитектура апплетов
- Создание заготовок апплетов
- Инициализация и завершение апплетов
- Перерисовка содержимого окон апплетов
- Вывод данных в окне состояния
- Передача параметров апплетам
- Представление о классе Applet
- Применение модели делегирования событий
- Описание остальных ключевых слов Java
Цель данной книги — поведать читателю об основных элементах Java, и мы близки к завершению этого повествования. Тринадцать предыдущих глав были посвящены тем средствам, которые определяют Java как язык программирования, в том числе ключевым словам, синтаксису, блочной структуре, правилам преобразования типов и т.д. Теперь у вас должно быть достаточно знаний, чтобы писать реальные программы на Java. Но еще остаются вопросы программирования, которые невозможно разрешить с помощью ключевых слов, и поэтому приходится обращаться к классам API и специальным технологиям. В этой главе речь пойдет об апплетах и событиях.
Следует, однако, иметь в виду, что темы апплетов и событий довольно обширны, а полное и подробное их изложение выходит за рамки этой книги. Поэтому апплеты и события будут рассмотрены в этой главе лишь в самых общих чертах, хотя и проиллюстрированы на ряде примеров. Но не следует забывать, что это только самые основы. И тем не менее, усвоив эти основы, вы сможете опереться на них как на прочный фундамент для пополнения своих знаний и совершенствования навыков программирования на Java.
В конце этой главы приводится описание ключевых слов Java, которые еще не рассматривались в данной книге, например instanceof и native. Эти языковые средства предназначены для решения более сложных задач программирования на Java, а здесь они рассматриваются ради полноты представления об этом языке.
Общее представление об апплетах
Апплеты существенно отличаются от всех программ, примеры которых были рассмотрены в предыдущих главах. Как пояснялось в главе 1, апплеты — это небольшие прикладные программы, предназначенные для передачи через Интернет и выполнения в веббраузере. В виртуальной машине Java поддерживаются все типы программ на Java, в том числе и апплеты, что дает возможность обеспечить достаточный уровень безопасности при динамической загрузке апплетов и последующем их выполнении в веб-браузере.
Прежде всего, апплеты подразделяются на две категории: те, что создаются на основе библиотеки Abstract Window Toolkit (AWT), и те, что создаются на основе библиотеки Swing. В апплетах обеих категорий поддерживается графический пользовательский интерфейс. Причем AWT позволяет работать с обычными элементами пользовательского интерфейса, a Swing — с альтернативными им упрощенными компонентами. В этой главе рассматриваются апплеты, создаваемые на основе библиотеки AWT, тогда как библиотеке Swing посвящена глава 15. Следует, однако, иметь в виду, что в апплетах на основе Swing используется та же самая архитектура, что и в апплетах на основе AWT. Более того, библиотека Swing построена на основе библиотеки AWT. Поэтому сведения и приемы программирования, представленные в этой главе, в равной степени относятся к обеим категориям апплетов.
Перед тем как приступить к подробному изложению теоретических вопросов, рассмотрим простой пример апплета. Он выполняет лишь одно действие: отображает в окне строку «Java makes applets easy» (Java упрощает создание апплетов).
В начале апплета находятся два оператора import. С помощью первого из них импортируются классы из библиотеки Abstract Window Toolkit. Благодаря тому что в состав этой библиотеки входят средства поддержки оконного графического пользовательского интерфейса, апплеты (прямо или косвенно) взаимодействуют с пользователями именно через такой интерфейс, а не через консольный ввод-вывод. Как и следовало ожидать, размеры библиотеки AWT достаточно велики, поэтому подробное обсуждение всех ее возможностей выходит за рамки этой книги. Но поскольку в этой главе речь идет о создании лишь самых простых апплетов, то средства AWT будут использоваться в ней очень ограниченно. Во втором операторе import импортируется пакет applet, в который входит класс Applet. Любой апплет должен быть (прямо или косвенно) подклассом, производным от этого класса.
В следующей строке кода объявляется класс SimpleApplet, который должен быть открытым (public), поскольку доступ к нему будет осуществляться извне.
В классе SimpleApplet объявляется метод paint(). Этот метод является членом класса Component из библиотеки AWT, являющегося суперклассом по отношению к классу Applet, и должен переопределяться в апплете. Метод paint() вызывается всякий раз, когда в апплете должны быть обновлены выводимые данные. Такой вызов может быть сделан по разным причинам. Например, окно, в котором присутствует апплет, может быть перекрыто другим окном, а затем снова переведено на передний план. Окно может быть также свернуто, а затем развернуто до обычных размеров. Метод paint() всегда вызывается в начале выполнения апплета. Этому методу передается один параметр, который представляет собой объект типа Graphics. В этом объекте содержится графический контекст, описывающий среду, в которой выполняется апплет. Этот контекст используется в тех случаях, когда требуется вывести данные в окне апплета.
В теле метода paint() вызывается метод drawstring(), который является членом класса Graphics. Этот метод служит для вывода текстовой строки в окне апплета, начиная с точки с координатами X,Y. Общая форма его объявления имеет следующий вид:
где сообщение. — это символьная строка, которая должна быть выведена начиная с точки, имеющей координаты х,у. В Java верхний левый угол окна принято обозначать координатами 0,0. Вызов метода drawString() в рассматриваемом здесь апплете приводит к выводу в его окне сообщения, начиная с точки, имеющей координаты 20,20.
Обратите внимание на то, что в рассматриваемом здесь апплете отсутствует метод main(). Выполнение апплета начинается не так, как выполнение программ из примеров, рассмотренных ранее в этой книге. Сигналом к началу работы апплета служит передача имени класса браузеру или другой программе, допускающей выполнение апплетов.
Исходный код класса SimpleApplet компилируется таким же образом, как и примеры предыдущих программ. А запуск апплета на выполнение осуществляется иначе: средствами браузера или инструментального средства разработки, специально предназначенного для просмотра апплетов. Такое инструментальное средство входит в стандартный пакет JDK и называется appletviewer. Именно им следует пользоваться для выполнения апплетов, примеры которых приведены в этой главе. Разумеется, ничто не мешает вам употреблять для этой цели браузер, но на стадии разработки пользоваться средством просмотра appletviewer намного удобнее.
Для выполнения апплета (средствами браузера или appletviewer) можно, в частности, составить небольшой файл HTML-документа, который содержит дескриптор для загрузки апплета. В настоящее время компания Oracle рекомендует использовать для этой цели дескриптор APPLET. (С той же целью можно также воспользоваться дескриптором OBJECT или другими доступными методиками развертывания прикладных программ. За более подробными сведениями по данному вопросу обращайтесь к документации на Java.) Ниже приведен код из HTML-документа, с помощью которого запускается апплет SimpleApplet.
Атрибуты width и height задают размеры области отображения, используемой в апплете.
Для того чтобы запустить апплет SimpleApplet на выполнение средствами appletviewer, последнему нужно передать для открытия файл соответствующего HTML-документа. Так, если приведенный выше код HTML находится в файле StartApp. html, то для запуска апплета SimpleApplet в командной строке необходимо ввести следующее:
И хотя пользоваться отдельным файлом HTML-документа для запуска апплета вполне допустимо, существует и более простой способ добиться той же самой цели. Для этого достаточно ввести в самом начале исходного кода Java строку комментариев и указать в ней дескриптор APPLET. Если обратиться к примеру апплета SimpleApplet, то его исходный код будет выглядеть следующим образом:
Теперь апплет можно запустить на выполнение, передав имя его исходного файла средству просмотра applet viewer. Для запуска на выполнение апплета SimpleApplet в командной строке нужно ввести следующее:
Окно, формируемое апплетом SimpleApplet в appletviewer, будет выглядеть так, как показано на приведенном ниже рисунке.
Пользуясь appletviewer, не следует забывать, что это инструментальное средство просмотра апплетов отображает окно с обрамлением. А при запуске апплета в браузере обрамление у окна отсутствует.
Итак, подведем краткий итог того, что в настоящий момент известно об апплетах.
- Каждый апплет является подклассом, производным от класса Applet.
- Для выполнения апплета метод main() не требуется.
- Апплет должен выполняться средствами специальной программы просмотра или совместимого с Java веб-браузера.
- Для обмена данными с пользователем апплета потоки ввода-вывода не используются. Вместо этого применяются средства, предоставляемые библиотекой AWT или Swing.
Организация апплета и его основные элементы
Несмотря на то что рассмотренный ранее апплет удовлетворяет всем требованиям, он настолько прост, что ему вряд ли можно найти практическое применение. Но прежде чем приступать к созданию апплета, пригодного для применения на практике, следует дать хотя бы самое общее представление об организации апплетов, применяемых в них методах, и об их взаимодействии с исполняющей системой.
Как упоминалось ранее, апплет — это прикладная программа на Java с графическим пользовательским интерфейсом. Его архитектура отличается от консольных программ из примеров, рассмотренных ранее в этой книге. Если вы знакомы с основными принципами создания графических пользовательских интерфейсов, то можете считать себя полностью готовыми к написанию апплетов. В противном случае вам придется сначала усвоить эти принципы.
Прежде всего следует заметить, что апплет — это прикладная программа, управляемая событиями, и в этом отношении он сродни программе обработки прерываний. Взаимодействие апплета с исполняющей системой и пользователем происходит следующим образом. Апплет ожидает наступления некоторого события. Исполняющая система оповещает апплет о наступлении события, вызывая его обработчик, предусмотренный в апплете. При наступлении события апплет должен предпринять соответствующие действия, а затем вернуть управление исполняющей системе, что очень важно. Как правило, апплет не выполняет продолжительные операции, а в ответ на событие предпринимает несложные действия и затем возвращает управление исполняющей системе. Если же в апплете требуется выполнить конкретное повторяющееся задание (например, отображать сообщение, прокручиваемое в окне), то для этой цели придется запустить отдельный поток исполнения.
Следует также иметь в виду, что взаимодействие с апплетом происходит только по инициативе пользователя, а не наоборот. Когда консольной программе требуются данные от пользователя, она выводит на экран специальное приглашение, а затем вызывает один из методов ввода данных с консоли. А в апплете все происходит иначе. Пользователь обращается к апплету, когда у него есть в этом потребность. Запрос на взаимодействие доставляется апплету в виде события, которое последний должен обработать. Так, если щелкнуть мышью в окне апплета, будет сформировано событие от мыши. Если же нажать клавишу на клавиатуре в тот момент, когда фокус ввода находится в окне апплета, будет сформировано событие от клавиатуры. Кроме того, в окне апплета могут присутствовать элементы управления пользовательского интерфейса, например кнопки или флажки. Когда пользователь активизирует такой элемент, наступает соответствующее событие.
Несмотря на то что архитектура апплетов немного сложнее архитектуры консольной программы, понять ее совсем не трудно. Если у вас имеется опыт написания прикладных программ для Windows (или аналогичных систем с графическим пользовательским интерфейсом), значит, вам должно быть известно, каким сложным может быть их окружение. Правда, в Java предоставляется более простой подход к разработке прикладных программ (в данном случае апплетов), который усваивается легче и быстрее.
Хотя рассмотренный ранее класс SimpleApplet представляет собой подлинный апплет, он все же не содержит всех тех элементов, которые требуются для большинства апплетов. Почти во всех апплетах, кроме самых простых, переопределяется ряд методов, с помощью которых браузер или другая программа просмотра апплетов может контролировать их выполнение. Срок действия апплета определяется методами init(), start(),stop() HdestroyO, которые относятся к классу Applet. Пятый метод, paint(), часто переопределяется в апплетах, создаваемых на основе AWT. Этот метод наследуется от класса Component из библиотеки AWT. Четыре упомянутых выше метода собраны вместе с методом paint() в приведенной ниже заготовке апплета.
Несмотря на то что код этой заготовки не выполняет никаких действий, его можно скомпилировать и запустить на выполнение, а в дальнейшем создавать на его основе настоящие апплеты.
На заметку Переопределять метод paint() приходится главным образом в апплетах, создаваемых на основе библиотеки AWT. А в апплетах, создаваемых на основе библиотеки Swing, для перерисовки содержимого окна апплета чаще всего используется другой механизм.
Инициализация и завершение апплетов
Необходимо ясно представлять себе, в каком именно порядке вызываются методы, входящие в состав заготовки апплета. При запуске апплета на выполнение вызываются три метода в следующей последовательности.
- Метод init().
- Метод start().
- Метод paint().
По завершении работы апплета вызываются следующие методы.
- Метод stop().
- Метод destroy().
Рассмотрим все эти методы более подробно.
Метод init() вызывается первым при запуске апплета на выполнение. В теле этого метода, как правило, инициализируются переменные и выполняются другие действия, связанные с подготовкой апплета к выполнению.
После метода init() вызывается метод start(). С его помощью выполнение апплета возобновляется после остановки. Обычно это происходит в тех случаях, когда пользователь возвращается к ранее посещавшейся веб-странице, содержащей апплет. Таким образом, в течение срока действия апплета метод start() может быть вызван несколько раз.
Метод paint() вызывается всякий раз, когда данные, выводимые апплетом, должны быть обновлены в его окне, как пояснялось ранее.
Когда пользователь покидает веб-страницу, содержащую апплет, вызывается метод stop(). Это может быть сделано для того, чтобы приостановить любые порожденные потоки, созданные в апплете, а также выполнить другие действия для благополучного перевода апплета в режим простоя. Не следует, однако, забывать, что вызов метода stop() совсем не означает завершение работы самого апплета. Когда пользователь вернется к веб-странице с апплетом, его выполнение будет возобновлено благодаря вызову метода start().
Метод destroy() вызывается в том случае, когда апплет больше не нужен. Этот метод служит для выполнения операций по завершении работы апплета.
Запрос на перерисовку окна апплета
Вывод данных в окне апплета происходит только в том случае, если исполняющая система вызывает метод paint(). В связи с этим возникает вопрос: можно ли по инициативе апплета произвести перерисовку окна? Необходимость в этом чаще всего возникает при изменении данных, предназначенных для отображения. Допустим, в апплете отображается движущееся рекламное сообщение. Какой механизм должен быть использован для обновления окна всякий раз, когда внешний вид сообщения должен измениться? Напомним, что одним из основных ограничений, налагаемых на апплет, является требование как можно быстрее возвращать управление исполняющей системе. Поэтому в методе paint() нельзя создать цикл, в котором постоянно изменялся бы вид сообщения. Принимая во внимание это ограничение, можно прийти к заключению, что вывод данных в окне апплета — дело непростое. К счастью, это совсем не так. Если требуется изменить данные, отображаемые в окне апплета, достаточно вызвать метод repaint().
Этот метод определен в классе Component, входящем в состав библиотеки AWT. Он сообщает исполняющей системе о том, что метод paint() должен быть вызван из апплета при первой же возможности. Если, например, в апплете возникнет потребность вывести данные, их нужно сначала сохранить, а затем вызвать метод repaint(). В итоге будет вызван метод paint(), чтобы отобразить сохраненные изменившиеся данные. Так, если в апплете требуется вывести символьную строку, ее нужно сначала сохранить в переменной типа String, а затем вызвать метод repaint(). А в самом методе paint() символьная строка будет выведена с помощью метода drawstring().
Ниже приведена простейшая форма вызова метода repaint().
Этот метод производит перерисовку всего окна апплета.
В другой форме вызова метода repaint() задается конкретная область для перерисовки.
Координаты верхнего левого угла перерисовываемой области задаются с помощью параметров слева и сверху, а параметры ширина и высота определяют конкретную ширину и высоту этой области. Все размеры задаются в пикселях. Указывая области для перерисовки, можно значительно увеличить быстродействие программы, поскольку для обновления содержимого окна требуется немало времени. Если же требуется перерисовать лишь небольшую область, то задавать обновление всего окна нет никакой надобности.
Применение метода repaint() будет продемонстрировано в примере для опробования 14.1.
Перерисовку окна апплета можно организовать и с помощью метода update(), который переопределяется во многих апплетах. Этот метод объявляется в классе Component и вызывается в том случае, если требуется перерисовать часть окна апплета. В используемом по умолчанию варианте метода update() просто вызывается метод paint(). Но, переопределив метод update(), можно выполнить и более сложные операции, рассмотрение которых, впрочем, выходит за рамки этой книги. Переопределение метода update() осуществляется только в апплетах, создаваемых на основе библиотеки AWT.
Пример для опробования 14.1. Простой апплет для формирования крупного заголовка на веб-странице
Работу метода repaint() удобно продемонстрировать на примере следующего простого апплета. Он выполняет прокрутку крупного заголовка в окне слева направо. А поскольку такую прокрутку нужно выполнять постоянно, то реализовать ее следует в отдельном потоке, который создается при инициализации апплета. Подобные крупные заголовки называются еще баннерами и часто встречаются на веб-страницах, а в этом проекте демонстрируется, каким образом можно создать такой заголовок, используя апплет Java.
Создайте файл Banner.java.
Начните создание апплета со следующих строк кода:
Обратите внимание на то, что класс Banner не только является подклассом, производным от класса Applet, но и реализует интерфейс Runnable. Это необходимо потому, что апплет создает еще один поток исполнения, который служит для прокрутки крупного заголовка по горизонтали. Текст крупного заголовка хранится в переменной msg типа String, ссылка на поток, в котором выполняется апплет, хранится в переменной t, а логическая переменная stopFlag служит для остановки апплета. В методе init() переменной t исходно присваивается пустое значение null.
Введите метод start(), исходный код которого приведен ниже.
Исполняющая система вызывает метод start() для запуска апплета на выполнение. В этом методе создается новый поток исполнения, а ссылка на него присваивается переменной t типа Thread. Затем переменная stopFlag инициализируется логическим значением false. Далее поток запускается при вызове t. start(). Это, в свою очередь, приводит к вызову метода run(). Следует, однако, иметь ввиду, что метод start() из класса Thread не имеет ничего общего с одноименным методом, определенным в классе Applet.
Введите метод run(), исходный код которого приведен ниже.
В методе run() вызывается метод repaint(), что в конечном итоге приводит к вызову метода paint() и отображению текущего содержимого переменной msg на экране. Между последовательными шагами цикла выполнение метода run() приостанавливается на четверть секунды. В результате содержимое переменной msg постоянно прокручивается справа налево. На каждом шаге цикла проверяется содержимое переменной stopFlag. И как только она примет логическое значение true, выполнение метода run() завершится.
Введите методы stop() и paint(), исходный код которых приведен ниже.
Если пользователь браузера переходит на другую веб-страницу, вызывается метод stop(), в котором переменной stopFlag присваивается логическое значение true, завершая тем самым выполнение метода run(). В этом же методе переменной t присваивается пустое значение null. После этого она уже не ссылается на объект типа Thread, а следовательно, этот объект будет удален системой “сборки мусора”. Этот механизм используется для остановки потока, когда страница с апплетом не просматривается. Когда же она снова появляется в окне браузера, вызывается метод start(), запускающий новый поток манипулирования крупным заголовком.
В методе paint() символы строки крупного заголовка, хранящегося в переменной msg, постоянно сдвигаются влево. После каждого сдвига вызывается метод drawstring(), выводящий текущее содержимое переменной msg на экран.
Ниже приведен весь исходный код апплета для формирования крупного заголовка на веб-странице.
Ниже приведен результат выполнения данного апплета.
Применение строки состояния
Помимо отображения информации в основном окне, апплет может также выводить сообщения в строке состояния браузера или другого средства просмотра апплетов. Для вывода сообщения в строке состояния следует вызвать метод showStatus(), определенный в классе Applet. При вызове этому методу в качестве параметра передается выводимая символьная строка. Ниже приведена общая форма объявления метода showStatus().
где сообщение обозначает выводимую символьную строку.
В строке состояния удобно отображать сведения о том, что происходит при выполнении апплета, подсказывать пользователю дальнейшие действия или выводить сообщения об ошибках. Строка состояния незаменима при отладке, поскольку дает возможность без труда выводить всю необходимую информацию об апплете.
Ниже приведен пример апплета, демонстрирующий применение метода showStatus().
Выполнение этого апплета дает приведенный ниже результат.
Передача параметров апплету
По мере необходимости апплету можно передать один или более параметр. Для этой цели предусмотрен атрибут PARAM дескриптора APPLET. С его помощью задается имя и значение параметра. А для извлечения параметра служит метод getParameter(), определенный в классе Applet. Он объявляется следующим образом:
где имя_параметра обозначает конкретное имя передаваемого параметра. Этот метод возвращает значение указанного параметра в виде объекта типа String. Так, если апплету требуется передать числовое или логическое значение, его строковое представление придется преобразовать во внутренний формат. Если же указанный параметр не найден, метод возвращает пустое значение null. Поэтому в исходный код апплетов следует включать проверку правильности значений, возвращаемых методом getParameter(). Желательно также проверять, правильно ли было выполнено преобразование числового значения параметра, передаваемого апплету.
Ниже приведен пример, демонстрирующий процесс передачи параметров апплету.
Выполнение этого апплета дает приведенный ниже результат.
Как пояснялось ранее, все апплеты представляют собой подклассы, производные от класса Applet. Класс Applet наследует переменные и методы следующих классов из библиотеки AWT: Component, Container и Panel. В результате апплет получает все функциональные возможности, доступные в библиотеке AWT.
Помимо методов, рассмотренных в предыдущих разделах, класс Applet содержит ряд других методов, которые предоставляют средства для более полного управления процессом выполнения апплетов. Все методы, определенные в классе Applet, приведены в табл. 14.1.
Таблица 14.1. Методы, определенные в классе Applet
Метод | Описание |
---|---|
void destroy() | Вызывается браузером непосредственно перед завершением апплета. Если же перед завершением апплета требуется освободить ресурсы или выполнить какие-нибудь другие подготовительные действия, этот метод следует переопределить |
AccessibleContext getAccessibleContext() | Возвращает контекст доступности для вызывающего объекта |
AppletContext getAppletContext() | Возвращает контекст, связанный с апплетом |
String getAppletlnfо() | Возвращает строку, описывающую апплет |
AudioClip getAudioClip(URL url) | Возвращает объект типа AudioClip, инкапсулирующий аудиоклип, доступный по адресу, задаваемому параметром url |
AudioClip getAudioClip(URL url, String clipName) | Возвращает объект типа AudioClip, инкапсулирующий аудиоклип, доступный по адресу, задаваемому параметром url, и называемый по имени, которое указывает параметр clipName |
URL getCodeBase() | Возвращает веб-адрес (URL), связанный с апплетом |
URL getDocumentBase() | Возвращает веб-адрес (URL) того HTML-документа, который вызывает апплет |
Image getlmage(URL url) | Возвращает объект типа Image, инкапсулирующий изображение, доступное в месте, определяемом параметром url |
Image getlmage (URL url, String imageName) | Возвращает объект типа Image, инкапсулирующий изображение, доступное в месте, определяемом параметром url, и называемое по имени, указываемому параметром imageName |
Locale getLocale() | Возвращает объект типа Locale, который используется классами и методами, реагирующими на настройки региональных и языковых параметров системы |
String getParameter(String paramName) | Возвращает параметр по имени, указываемому параметром paramName. Если параметр не найден, возвращается пустое значение null |
String[][] getParameterlnfо() | Переопределенный вариант этого метода возвращает таблицу объектов типа String с описанием параметров, распознаваемых апплетом. Каждый элемент таблицы должен состоять из трех строк, содержащих имя параметра, описание его типа и/или диапазона допустимых значений, а также краткое пояснение назначения параметра. В исходном варианте реализации этот метод возвращает пустое значение null |
void init() | Этот метод выполняется первым при запуске любого апплета на выполнение |
boolean isActive() | Возвращает логическое значение true, если апплет выполняется. А если выполнение апплета приостановлено, то возвращает логическое значение false |
boolean isValidateRoot() | Возвращает логическое значение true, указывающее на то, что апплет является достоверным корнем, т.е. он прошел проверку на достоверность. (Добавлен в версии JDK 7.) |
static final AudioClip newAudioClip(URL url) | Возвращает объект типа AudioClip, инкапсулирующий аудиоклип, доступный по адресу, задаваемому параметром url. Этот метод подобен методу getAudioClip(), за исключением того, что онявляется статическим и для его вызова не требуется ссылка на объект типа Applet |
void play(URL url) | Воспроизводит аудиоклип, если он найден по адресу, задаваемому параметром url |
void play (URL url, String clipName) | Воспроизводит аудиоклип, если он найден по адресу, задаваемому параметром url, под именем, обозначаемым параметром clipName |
void resize(Dimensiondim) | Изменяет размеры апплета по значениям, указываемым параметром dim. Класс Dimension входит в пакет java.awt. В нем содержатся два целочисленных поля, width и height, в которых задаются ширина и высота апплета соответственно |
void resize (int width, int height) | Изменяет размеры апплета по значениям, указываемым параметрами width и height |
final voidsetStub(AppletStub stubObj) | Задает stubObj в качестве заглушки для апплета. Используется в основном исполняющей системой и не вызывается из апплета. Заглушкой называется фрагмент кода, устанавливающий связь между апплетом и браузером |
void showStatus(String str) | Отображает символьную строку str в строке состояния браузера или другом средстве просмотра апплетов. Если строка состояния отсутствует в браузере, никакие действия не выполняются |
void start() | Вызывается браузером в том случае, если апплет должен начать (или возобновить) свое выполнение. Этот метод вызывается при запуске апплета на выполнение после метода init() |
void stop() | Вызывается браузером с целью приостановить выполнение апплета.Выполнение приостановленного апплета может быть возобновлено вызовом метода start() |
Все программы, написанные на Java с графическим пользовательским интерфейсом, в том числе и апплеты, управляются событиями. Следовательно, обработка событий служит основанием для успешного программирования графического пользовательского интерфейса. Большинство событий, на которые должна реагировать подобная программа, наступают в результате действий пользователя. Эти события передаются программе разными способами. События разделяются на отдельные категории, например события от мыши, клавиатуры, а также события, наступающие в результате взаимодействия пользователя с элементами пользовательского интерфейса. Классы поддержки событий в библиотеке AWT относятся к пакету java.awt.event.
Прежде чем приступить к подробному рассмотрению событий, следует заметить, что обсудить столь обширную тему более или менее подробно в рамках этой книги просто невозможно. Тем не менее приведенный ниже краткий обзор данной темы позволит вам успешно создавать несложные обработчики событий при написании реальных программ.
Модель делегирования событий
Современный подход к обработке событий основывается на модели делегирования событий. Эта модель описывает стандартный механизм формирования событий и их обработки. Она действует по очень простому принципу: событие формируется источником и передается одному или нескольким приемникам. В соответствии с этим принципом приемники лишь ожидают события. При наступлении событий они обрабатывают их и возвращают управление. Преимущество такого подхода заключается в том, что логика обработки событий четко отделена от логики пользовательского интерфейса, ющего эти события. Элемент пользовательского интерфейса способен делегировать (т.е. поручать) обработку события отдельному фрагменту кода. В модели делегирования событий их приемники должны быть зарегистрированы в источнике, чтобы получать уведомления о событиях для их последующей обработки.
Согласно модели делегирования, событие является объектом, описывающим изменения в состоянии источника. Событие может быть сформировано в результате действий пользователя, в том числе активизации элементов графического пользовательского интерфейса. Такими действиями может быть нажатие кнопки, ввод символа с клавиатуры, выбор пункта списка или щелчок кнопкой мыши.
Источник события — это объект, сформировавший его. Для того чтобы приемник получил уведомление о конкретном виде события, он должен быть зарегистрирован в его источнике. Для каждого вида события определен собственный метод регистрации. Ниже приведена общая форма объявления методов регистрации.
где Тип — это имя события, а элемент — ссылка на приемник события. Например, метод, регистрирующий приемник событий от клавиатуры, объявляется как addKeyListener(). А для регистрации приемника событий от перемещения мыши служит метод addMouseMotionListener(). При наступлении события все приемники оповещаются и получают копию, описывающую его объект.
Источник должен также предоставлять метод, позволяющий отменить регистрацию приемника событий определенного вида. Ниже приведена общая форма объявления такого метода.
Здесь, как и прежде, Тип — это имя события, а элемент — ссылка на его приемник. Например, для того чтобы удалить приемник событий от клавиатуры, следует вызвать метод removeKeyListener().
Методы, добавляющие или удаляющие приемники событий, предоставляются источниками, формирующими эти события. Например, в классе Component предоставляются методы, позволяющие добавлять или удалять приемники событий от клавиатуры и мыши.
Приемник — это объект, уведомляемый о наступлении события. К нему предъявляются два основных требования. Во-первых, он должен быть зарегистрирован в одном или нескольких источниках, чтобы получать от них уведомления о конкретных видах событий. И во-вторых, он должен реализовать методы для получения и обработки уведомлений о событиях.
Методы, получающие уведомления о событиях из библиотеки AWT и обрабатывающие их, определены в интерфейсах, относящихся к пакету java.awt.event. Например, в интерфейсе MouseMotionListener объявлены методы, получающие уведомления о перемещении и перетаскивании мыши. Всякий объект, реализующий этот интерфейс, может получать уведомления о подобных событиях и обрабатывать их.
Классы, представляющие события, положены в основу механизма обработки событий в Java. Они образуют иерархическую структуру, на вершине которой находится класс EventObject, относящийся к пакету java.util. Он служит суперклассом для всех событий. Класс AWTEvent, относящийся к пакету java.awt, является подклассом, производным от класса EventOb j ect. Он, в свою очередь, выступает в роли родительского класса для всех событий из библиотеки AWT, используемых в модели делегирования событий.
В пакете java.awt.event определено несколько видов событий, формируемых различными элементами пользовательского интерфейса. Краткое описание некоторых из наиболее употребительных событий подобного рода приведено в табл. 14.2.
Таблица 14.2. Основные классы событий из пакета java.awt.event
Класс события | Описание |
---|---|
ActionEvent | Формируется после щелчка на кнопке, двойного щелчка на элементе списка или выбора пункта меню |
AdjustmentEvent | Формируется при манипулировании полосой прокрутки |
ComponentEvent | Формируется, когда компонент становится видимым или невидимым, а также при изменении его размеров и перемещении |
ContainerEvent | Формируется, когда компонент добавляется в контейнер или удаляется из него |
FocusEvent | Формируется, когда компонент получает или теряет фокус ввода |
InputEvent | Абстрактный суперкласс для всех классов событий, связанных с вводом данных |
ItemEvent | Формируется по щелчку на флажке или элементе списка, а также наступает при выборе или отмене выбора пункта меню |
KeyEvent | Формируется при вводе данных с клавиатуры |
MouseEvent | Формируется при перемещении или перетаскивании мыши, а также по нажатию, отпусканию или щелчку кнопкой мыши или же в том случае, когда курсор мыши наводится на элемент интерфейса или перемещается с него |
TextEvent | Формируется при изменении содержимого области или поля ввода текста |
WindowEvent | Формируется, если окно делается активным или неактивным, сворачивается или разворачивается, открывается или закрывается либо покидается |
Интерфейсы приемников событий
Приемники событий получают уведомления об их наступлении. Приемники событий из библиотеки AWT реализуют один или несколько интерфейсов, относящихся к пакету java.awt.event. При наступлении события источник вызывает соответствующий метод, определенный приемником, и передает ему объект события в качестве аргумента. В табл. 14.3 перечислены наиболее употребительные интерфейсы приемников событий и кратко описаны объявленные в них методы.
Таблица 14.3. Наиболее употребительные интерфейсы приемников событий
Интерфейс | Описание |
---|---|
ActionListener | Определяет один метод для получения событий действий. Такого рода события наступают при нажатии кнопки, выборе пункта меню и т.д. |
AdjustmentListener | Определяет один метод для получения событий настройки, подобных тем, которые наступают при манипулировании полосой прокрутки |
ComponentListener | Определяет четыре метода для выявления факта сокрытия, показа, изменения размеров или перемещения компонента пользовательского интерфейса |
ContainerListener | Определяет два метода для выявления факта добавления компонента в контейнер или удаления из него |
FocusListener | Определяет два метода для выявления факта получения и потери компонентом фокуса ввода |
ItemListener | Определяет один метод для выявления факта изменения состояния элемента пользовательского интерфейса. Событие от элемента может формироваться, например, флажком |
KeyListener | Определяет три метода для выявления нажатия, отпускания клавишии ввода с клавиатуры |
MouseListener | Определяет пять методов для выявления щелчка кнопкой мыши, ее нажатия и отпускания, а также наведения курсора мыши на элемент пользовательского интерфейса или перемещения с него |
MouseMotionListener | Определяет два метода для выявления факта перемещения или перетаскивания мыши |
MouseWheelListener | Определяет один метод для выявления факта прокрутки колесика мыши |
TextListener | Определяет один метод для выявления факта изменения текстового значения |
WindowListener | Определяет семь методов для выявления факта открытия и закрытия, сворачивания и разворачивания, активизации и деактивизации или покидания окна |
Применение модели делегирования событий
А теперь, когда вы имеете общее представление о модели делегирования событий, перейдем к вопросам ее практического применения. Создавать апплеты, используя эту модель, совсем не трудно. По существу, написание кода для обработки событий сводится к следующему.
- Реализация соответствующего интерфейса в приемнике событий нужного вида.
- Написание кода для регистрации приемника событий, а если потребуется, то и отмены его регистрации. Не следует, однако, забывать, что источник, как правило, может формировать несколько видов событий. И для каждого из этих видов событий требуется регистрация отдельного приемника. Кроме того, один объект можно зарегистрировать для приема на обработку событий нескольких видов, но тогда он должен реализовать все интерфейсы, соответствующие этим видам событий.
Для того чтобы стало понятнее, как пользоваться моделью делегирования событий на практике, рассмотрим простой пример, в котором обрабатывается одни из самых распространенных видов событий: события от мыши. Этот пример демонстрирует порядок обработки элементарных событий от мыши. (Следует также иметь в виду, что обрабатывать можно и события от прокрутки колесика мыши. Но эта возможность оставляется вам в качестве упражнения для самостоятельного выполнения.)
Обработка событий от мыши
Для обработки событий от мыши следует реализовать интерфейсы MouseListener и MouseMotionListener. В интерфейсе MouseListener объявлено пять методов. По щелчку кнопкой мыши вызывается метод mouseClicked(). Если курсор мыши наводится на компонент пользовательского интерфейса, вызывается метод mouseEntered(), а если курсор мыши перемещается с этого компонента — метод mouseExited(). Методы mousePressed() и mouseReleased() вызываются, когда кнопка мыши нажимается и отпускается соответственно.
Ниже приведены общие формы объявления упомянутых выше методов.
В интерфейсе MouseMotionListener объявлены два метода. Метод mouseDragged() многократно вызывается при перетаскивании мыши, когда нажата ее левая кнопка. А обычное перемещение мыши приводит к такому же многократному вызову метода mouseMoved(). Ниже приведены общие формы объявления этих методов.
Событие описывается объектом типа MouseEvent, передаваемым каждому из методов в качестве параметра те. В классе MouseEvent определен целый ряд методов, которые можно использовать для получения подробных сведений о наступившем событии. Вероятно, наиболее употребительными в классе MouseEvent являются методы getx() и getY(), возвращающие координаты текущего положения курсора мыши (относительно окна) в момент наступления события. Ниже приведены общие формы объявления этих методов.
В примере, приведенном в следующем разделе, эти методы будут использованы для отображения сведений о текущем положении курсора мыши.
Простой пример апплета, демонстрирующий обработку событий от мыши
В этом разделе представлен пример апплета, в котором обрабатываются элементарные события от мыши, а в строке состояния отображаются координаты текущего положения курсора мыши. При нажатии кнопки мыши в месте расположения курсора на экран выводится слово «Down» (Нажато), а при отпускании кнопки — слово «Up» (Отпущено). И наконец, по щелчку кнопкой мыши в верхнем левом углу окна апплета появляется сообщение «Mouse clicked» (Произведен щелчок кнопкой мыши).
Когда курсор мыши наводится на окно апплета или отводится от него, в левом верхнем его углу выводится соответствующее сообщение. При перетаскивании курсора мыши его сопровождает символ *. Кроме того, при нажатии и отпускании кнопки мыши или перетаскивании курсора координаты его текущего положения сначала сохраняются в переменных mouseX и mouseY, а затем используются в методе paint() для вывода сообщения в той точке экрана, где произошло событие от мыши.
Выполнение этого апплета дает приведенный ниже результат.
Рассмотрим приведенный выше исходный код апплета более подробно. Класс MouseEvents расширяет класс Applet и реализует интерфейсы MouseListener и MouseMotionListener. В этих интерфейсах объявлены методы, получающие и обрабатывающие различные виды событий от мыши. В данном примере апплет одновременно выступает в роли источника и приемника событий. И это вполне допустимо, поскольку Applet является подклассом, производным от суперкласса Component, в котором определены методы addMouseListener() и addMouseMotionListener(). Ситуация, когда один и тот же класс одновременно служит источником и приемником событий, является типичной для апплетов.
В методе init() апплет регистрируется как приемник событий от мыши. Для этой цели используются методы addMouseListener() и addMouseMotionListener(), являющиеся членами класса Component. Ниже приведены общие формы объявления этих методов.
где ml и mml — ссылки на объекты, принимающие события от мыши и перемещения мыши соответственно. В данном примере для приема и обработки обоих видов событий используется один и тот же объект.
В рассматриваемом здесь апплете реализованы все методы, объявленные в интерфейсах MouseListener и MouseMotionListener. Они выступают в роли обработчиков разных событий, после чего возвращают управление.
Другие ключевые слова Java
И в завершение этой главы будет сделан краткий обзор остальных, не упоминавшихся ранее ключевых слов Java. К их числу относятся следующие ключевые слова:
- transient
- volatile
- instanceof
- native
- strictfp
- assert Перечисленные выше ключевые слова используются в более сложных программах, чем те, которые представлены для примера в этой книге. Рассмотрим эти ключевые слова вкратце, чтобы дать хотя бы самое общее представление об их назначении.
Модификаторы transient и volatile
Ключевые слова transient и volatile имеют весьма специфическое назначение. Если переменная экземпляра объявляется как transient, то при сохранении объекта ее содержимое не запоминается. Иными словами, поле transient не влияет на состояние объекта.
Модификатор volatile упоминался в главе И, но он заслуживает более пристального внимания. Объявив переменную как volatile, вы сообщаете компилятору, что ее значение может быть неожиданно изменено в результате действий, выполняемых в других частях программы. В главе 11 было показано, что подобная ситуация может возникнуть в многопоточных программах. В них одна и та же переменная часто используется несколькими потоками. Из соображений эффективности каждый поток может содержать собственную копию разделяемой переменной. Подлинная копия (или оригинал) переменной обновляется в различные моменты времени, например, при выполнении метода, объявленного как synchronized. Как правило, такой подход себя оправдывает, но иногда он оказывается неуместным. Ведь иногда требуется, чтобы оригинал переменной отражал текущее состояние, используемое во всех потоках. И для того чтобы обеспечить выполнение этого условия, переменную нужно объявить как volatile.
Ключевое слово instanceof
Иногда в процессе выполнения программы требуется выяснить тип того или иного объекта. Допустим, в одном потоке формируются объекты разных типов, а в другом потоке они обрабатываются. В таком случае обрабатывающему потоку должен быть известен тип того или иного объекта. Об этом должно быть известно и в том случае, когда приведение типов производится в процессе выполнения программы. В Java недопустимое приведение типов вызывает ошибку при выполнении программы. Многие недопустимые попытки приведения типов могут быть выявлены еще на стадии компиляции. Но если в приведение типов вовлекается иерархия классов, то такое приведение типов может оказаться недопустимым, хотя обнаружить его удастся лишь после запуска программы на выполнение. Так, переменная ссылки на суперкласс может ссылаться и на объекты его подклассов, поэтому на стадии компиляции не всегда удается определить, допустимо ли приведение типов, в которое вовлечена ссылка на суперкласс. В качестве выхода из подобных ситуаций служит использование ключевого слова instanceof. Ниже приведена общая форма оператора с этим ключевым словом.
Здесь экземпляр обозначает ссылку на экземпляр класса, а тип — имя класса или интерфейса. Если экземпляр имеет заданный тип или может быть приведен к нему, то в результате вычисления оператора instanceof получается логическое значение true, в противном случае — логическое значение false. Таким образом, с помощью ключевого слова instanceof можно получать сведения о типе объекта в процессе выполнения программы.
Ключевое слово strictfp
Ключевое слово strictfp относится к числу самых скрытых средств языка. После выпуска версии Java 2 модель вычислений с плавающей точкой претерпела некоторые изменения, став менее строгой. В частности, эта модель теперь не требует усечения промежуточных результатов вычислений. В ряде случаев это позволяет избежать нения или потери значимости. Указав перед классом, методом или интерфейсом модификатор strictfp, можно сообщить системе, что вычисления с плавающей точкой (и усечение промежуточных результатов соответственно) должны выполняться точно так же, как это происходило в ранних версиях Java. Если же класс помечен ключевым словом strictfp, то им же автоматически помечаются и все методы этого класса.
Ключевое слово assert
Ключевое слово assert используется на стадии разработки программ для создания утверждений, т.е. условий, которые, как предполагается, должны быть истинными при выполнении программы. Допустим, создан метод, который должен возвращать только положительное целочисленное значение. Проверить выполнение этого условия можно с помощью утверждения в операторе assert. Если при выполнении программы условие становится истинным, то никакие специальные меры не принимаются. А если условие становится ложным, то генерируется исключение AssertionError. Утверждения зачастую используются при тестировании программ, а в готовом коде они обычно не применяются.
Утверждение, создаваемое с помощью ключевого слова assert, может быть записано в двух общих формах. Первая из них выглядит следующим образом:
где условие обозначает выражение, результатом вычисления которого является логическое значение. Так, если условие оказывается истинным (true), то и утверждение истинно, и никаких действий не предпринимается. А если условие оказывается ложным (false), то и утверждение ложно, и в этом случае по умолчанию генерируется исключение AssertionError. Рассмотрим следующий пример:
В данном примере исключение возникнет лишь в том случае, если значение переменной п окажется меньше или равно нулю. В противном случае программа будет выполнена в обычном порядке.
Вторая общая форма утверждения имеет следующий вид:
В данном случае выражение дает значение, которое передается конструктору класса AssertionError. Это значение преобразуется в свое строковое представление и выводится в том случае, если утверждение оказывается ложным. Обычно выражение указывается в виде символьной строки, но оно может быть любого типа, кроме void, лишь бы оно допускало корректное преобразование его результата в строковое представление.
Для того чтобы утверждения проверялись при выполнении программы, интерпретатор нужно запустить с параметром -еа. Так, если требуется разрешить проверку утверждений в программе Sample, в командной строке необходимо указать следующее:
Утверждения очень полезны на стадии разработки программ, поскольку они упрощают и ускоряют поиск ошибок, что и является целью тестирования. Но, применяя данное средство, нужно соблюдать осторожность. В частности, нельзя полагаться на утверждения, собираясь выполнить любые операций, фактически требующиеся в программе. Дело в том, что готовый код может быть запущен и без параметра, разрешающего проверку утверждений, а следовательно требуемые действия не будут выполнены, поскольку выражения в утверждениях не вычисляются.
Иногда при выполнении программ на Java приходится вызывать подпрограммы, написанные на других языках программирования. Чаще всего такие подпрограммы существуют в исполняемом коде для конкретного ЦП и рабочей среды, т.е. в собственном коде. В одних случаях подпрограммы в собственном коде вызываются для ускорения работы приложения, а в других случаях приходится обращаться к средствам специализированных библиотек независимых производителей, например, к пакету для статистических расчетов. Но поскольку программы на Java компилируются в байт-код, а затем интерпретируются исполняющей системой (или компилируются динамически), то на первый взгляд может показаться, что вызвать подпрограмму в собственном коде из программы на Java невозможно. К счастью, это совсем не так. Для этой цели в Java предусмотрено ключевое слово native, с помощью которого объявляются собственные методы. Если метод объявлен как собственный (native), он может быть вызван из программы на Java точно так же, как и обычный метод.
Для того чтобы объявить собственный метод, перед его именем следует указать ключевое слово native, но не определять тело метода, как показано ниже,
Как только собственный метод будет объявлен, необходимо предоставить сам этот метод и предпринять ряд сложных действий по его связыванию с кодом Java.