20 октября 2019 года    
Воскресенье | 15:27    
Главная
 Новости
Базы данных
Безопасность PC
Всё о компьютерах
Графика и дизайн
Интернет-технологии
Мобильные устройства
Операционные системы
Программирование
Программы
Связь
Сети
 Документация
Статьи
Самоучители
 Общение
Форум







Разделы / Программирование / Java

Frequently Asked Questions (with answers) for Java programmers.

Секция 6 из 7 - Предыдущая - Следующая
Все секции - 1 - 2 - 3 - 4 - 5 - 6 - 7


Вы можете перекрыть метод processMouseEvent для Вашего компонента.

public void processMouseEvent(MouseEvent e) {
    if (e.isPopupTrigger())  {
       // делайте что хотите
    }
    else
      super.processMouseEvent(e);
  }

Этот код подходит для JDK 1.1. Кроме того, в JDK 1.2 можно вызвать
java.awt.swing.SwingUtilities.isRightMouseButton(MouseEvent me).

См. вопрос 15.10.

                       ------------------------------

11. Swing

  1. (Часть 11) Что такое Swing?

     [*] Swing - это новая оконная библиотека, включеная в JDK 1.2, и
     доступная как дополнительная библиотека для JDK 1.1. Swing входит в
     Java Foundation Classes и поддерживает оконую библиотеку, которая дает
     разроботчикам создавать компоненты, которые могут иметь изменяемый
     внешний вид и поведение. С точки зрения архитектуры, Swing расширяет
     (но не заменяет полностью) Abstract Windowing Toolkit (AWT).

     Swing содержит множество компонент, которые можно использовать вместо
     компонентов AWT (JFrame вместо Frame, JButton вместо Button, JApplet
     вместо Applet, JPanel вместо Panel и т.п.) Кроме того, есть есть
     компоненты, не имеющие аналогов в AWT (панели и линейки инструментов,
     линейки прогресса и др.) Тем не мене, в основе Swing лежит AWT.

     Swing позволяет создавать компоненты столь же сложные, как и в
     платформо-зависимых оконных библиотеках, как, например, MFC - и в
     соответсви с преимущесвами Java, все это будет работать на любых
     платформах. Изменяемый внешний вид означает, что компоненты могут
     иметь одинаковый вид на любой платформе, или же Вы можете сделать так,
     что окна будут выглядеть в стиле Windows на PC, в стиле Motif - на
     Unix-станции, либо по выбору пользователя.

     Кроме того, Swing подерживает Accessiblity API. Этот API позволяет
     адаптирующим программам для людей с физическими недостатками напремую
     взаимодействовать с Java VM и получать информацию о выполняемой
     программе; это применяется для работы с компонентами. Программы могут
     затем перевести это в форму, доступную пользователю (например,
     прочитать вслух текст в окне). Swing не использует платформо-зависимые
     компоненты, а адаптивные программы расчитаны на опрделенную платформу,
     Accessiblity API служит мостом между Swing и программой адаптации.
     Достоинством Accessiblity API является то, что для его поддержки
     разработчикам нужно сделать совсем немного, они должны сознавать это,
     если собираются добовлять новые компоненты.

     В Swing платформо-зависимыми являются лишь края окна, а также такие
     вещи, как шрифты и буфферы. Все остальное - композиция, расположение и
     отрисовка - контролируется программным кодом на Java. Таким образом,
     одинаковый код создает и управляет интерфейсом пользователя на любой
     платформе. Swing обеспечивает одинаковое поведение програмыы на разных
     платформах.

     Swing работает с JDK 1.1, скачайте файл swing.jar и добывте его в путь
     поиска классов. Swing встроен в JDK 1.2, и Javasoft недавно сменила
     название пакета на javax.swing.

*(Часть 11) Почему курсор, определенный как курсор ожидания (WAIT_CURSOR),
изменяется только, когда находится над некоторыми компонентами?
или
Как изменить обычный курсор на курсор ожидания над любой из областей окна,
включая его компоненты, для предотвращения каких-либо действий со стороны
пользователя во время обработки некоторого события? (Например доступ к базе
данных, открытие другого окна, загрузка изображения, сортировка данных и
т.д.)

[*] В JDK 1.0.2 изменять курсор мог только Фрейм awt. Начиная с JDK 1.1
работа с Курсором была перенесена в класс Component. Теперь все Компоненты
имеют доступ к классу Cursor.

Вы могли изменять Курсор на курсор ожидания для каждого из Компонентов. В
ряде случаев это отнимало немало времени, так как потенциально их у Вас
могло быть довольно много. Начиная с JFC Swing появился механизм для
изменения Курсора над всем Окном целиком, не считаясь с количеством
компонентов. Компонент библиотеки Swing - JFrame содержит метод:

             public void setGlassPane(Component glassPane)

который устанавливает Компонент awt как 'glassPane' для JFrame.

Этот Компонент перекроет всю, принадлежащую JFrame, доступную (видимую в
данный момент) область пользователя, исключая границу, установленную
отображающей оконной системой. Используя Компонент 'glassPane', Вы можете
включить 'Курсор ожидания' над всем JFrame, запрещая пользовательский ввод
(его полностью получает 'glassPane') и блокируя пользователя пока не
завершится 'другой' процесс.

ЗАМЕЧАНИЕ: Если Вы хотите видеть Курсор ожидания во время работы 'другого'
процесса, то необходимо создать Поток для выполнения последнего. Когда
происходит выполнение 'другой' работы, 'glassPane' отображает Курсор
ожидания и "проглатывает" весь ввод пользователя. По завершении 'другой'
работы, Поток использует Ваш метод waitCursor() чтобы скрыть 'glassPane' до
тех пор пока он не понадобится снова.

*(Часть 11) Почему компилятор сообщает, что метод "isCanselled()",
принадлежащий javax.swing.ProgressMonitor, не найден?

[*] В американском английском есть два допустимых варианта произношения:
"canceled" и "cancelled". Заметьте, что первый содержит одну "l", а второй
- две "ll". Sun использует вариант "canceled" для ProgressMonitor, но во
многих второстепенных исходниках из документации написано "cancelled". Еще
неприятней то, что в некоторых случаях Sun употребляет также и вариант
"cancelled", как например в названии метода "isCancelled()" для PrinterJob.

*(Часть 11) Почему нажатие на клавишу Enter не активизирует кнопку по
умолчанию в диалоговом окне библиотеки Swing?

[*] Раскладка клавиш по умолчанию для текстовых компонентов библиотеки
Swing (произошедших от JTextComponent) привязывает Enter (VK_ENTER) к
ActionEvent для текстовых полей. Это было сделано в целях сохранения
совместимости с работой java.awt.Textfield. Чтобы использовать клавишу
Enter для активизации кнопки по умолчанию, удалите привязку первой из
предлагаемой раскладки клавиш текстового компонента, как показано ниже:

    static {
      KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
      Keymap map =
           JTextComponent.getKeymap(JTextComponent.DEFAULT_KEYMAP);
      map.removeKeyStrokeBinding(enter);
    }

*(Часть 11) Как создавать непрямоугольные Компоненты?

[*] Взгляните на следующий пример, поставляемый вместе с JDK:
$JAVAHOME\demo\awt-1.1\lightweight\RoundButtons\example.html

                       ------------------------------

12. Браузеры

  1. (Часть 12) Когда же мой любимый браузер будет поддерживать Java 1.1?

     [*] В настоящий момент все популярные браузеры имеют поддержку JDK
     1.1. Netscape Communicator 4.04 с патчем "J" полностью поддерживает
     возможности Java 1.1. Он был выпущен в декабре 1997 года, и
     единственное, что там отсутствует,- поддержка JavaSoft для подписи
     апплетов (в этом вопросе Netscape пошла своим путем). Смотрите
     http://developer.netscape.com/support/faqs/champions/java.html#21
     Если Вы используете Netscape 4.05, и консоль сообщает что-нибудь
     отличное от Java 1.1.5, то значит Ваш Netscape не полностью
     поддерживает 1.1. Здесь находится специальная ознакомительная версия:
     http://developer.netscape.com/software/jdk/download.html

     В 1997 году Netscape ослабила поддержку Java в связи с захватом рынка
     компанией Microsoft. Microsoft использует IE, как стратегическое
     средство для внедрения того, что служащие этой компании называют
     "загрязненная Java" ("polluted Java"). Для обоих браузеров хорошим
     решением является Java Plug-in.

     Браузер фирмы Sun,- HotJava,- полностью поддерживает все возможности
     JDK 1.1. Людям, вынужденным пользоваться браузером без полной
     поддержки Java, следует применять Java Plug-In, заменяющий стандартную
     виртуальную машину Java, которой комплектуется браузер, и позволяющий
     использовать RMI, компоненты JavaBeans и Основные Классы Java (Java
     Foundation Classes) в Internet Explorer 3.02, 4.0 и 4.01. Java Plug-In
     также без проблем работает с браузерами Netscape. Его можно получить
     по адресу http://java.sun.com/products/.
     Заметьте, что надо немного изменить HTML для полной уверенности в том,
     что работает именно plug-in, а не JVM браузера. Данный продукт
     производит все изменения автоматически.

  2. (Часть 12) Какие подпрограммы апплета вызываются в различных браузерах
     и plug-in'ах в ответ на возможные действия, управляющие просмотром
     (назад (back), вперед (forward), загрузить (load) и т.д.)?

     [*] Сторонник Java - Dave Postill - провел работу, чтобы получить
     ответ на этот вопрос.
     Жизненный цикл апплета определяется вызовами init(), start(), stop() и
     destroy(). Будьте осторожны при использовании потоков в апплетах. Во
     многих образцах кода метод stop() вызывает остановку всех потоков в
     пределах апплета, а затем устанавливает их в нуль (null).

     Такое уничтожение потоков является по меньшей мере опрометчивым.
     Многие думают, что метод stop() вызывается только, когда пользователь
     покидает страничку и хочет о ней забыть; но, так как Netscape вызывает
     stop() даже, когда происходит изменение размера окна, то пользователи
     утратят состояние апплета, когда будут производить незначительную, по
     их мнению, настройку.

     Смотрите "Совет по Java (Java Tip) 8: Потоки, Netscape и проблема
     изменения размера (resize) окна - Как работать с изменением размера
     окна апплетa в Netscape Navigator", JavaWorld
     http://www.javaworld.com/javatips/jw-javatip8.html. К сожалению
     решение JavaWorld не решает проблему полностью, поскольку в нем для
     распознавания изменения размера окна предполагается, что start() будет
     вызван вскоре после stop(). Однако, если вы минимизируете окно с
     браузером, то он может послать Апплету stop(), и затем не вызывать
     start(), пока окно Браузера не будет восстановлено или
     максимизировано. В таком случае использование решения JavaWorld в
     Апплете уничтожит его, если минимизированный Браузер не восстановить в
     исходное состояние до момента истечения времени блокировки уничтожения
     Потоков.

                                             Просмотрщик             Internet
                     Netscape    Netscape с  Апплетов    Internet    Explorer
                     [4.04/JDK   Plug-In'ом  (Applet-    Explorer 4  с
Plug-In'ом
                     1.1.4]      [4.05/ JDK  Viewer)     SP1 [5.00.0518.10
                     [4.05/JDK   1.1.5/      [JDK 1.1.5] 4.72.3110.8 / Plugin
1.1]
                     1.1.5]      Plugin 1.1]             для NT 4.0  для NT 4.0
                                             [JDK 1.1.6] SP3         SP3
      1. Очистка кэша
      браузера       ничего      ничего      ничего      ничего      ничего
                     init(),
      2.             start() или
      Первоначальная init(),     init(),     init(),     init(),     init(),
      загрузка .html start(),    start()     start()     start()     start()
                     stop(),
                     start() [1]

      3. Назад       stop()      stop(),     [4]         stop(),     stop(),
                                 destroy()               destroy()   destroy()

      4. Вперед      start()     init(),     [4]         init(),     init(),
                                 start()                 start()     start()
                     stop(),     stop(),                 stop(),     stop(),
      5.             destroy(),  destroy(),              destroy(),  destroy(),
      Перезагрузить  init(),     init(),     [4]         init(),     init(),
                     start()     start()                 start()     start()
      6. <shift>
      перезагрузить  stop(),     stop(),                 stop(),     stop(),
      [NS],          destroy(),  destroy(),              destroy(),  destroy(),
      <ctrl>         init(),     init(),     [4]         init(),     init(),
      перезагрузить  start()     start()                 start()     start()
      [IE]
      7. Изменить    stop(),
      размер         start()     [3]         [3]         [3]         [3]
      8.
      Минимизировать [2]         [3]         stop()      [2]         [3]
      9. Восстановить[2]         [3]         start()     [2]         [3]

      10. Выйти      stop(),     stop(),     stop(),     stop(),     stop(),
                     destroy()   destroy()   destroy()   destroy()   destroy()

     Примечания:
     [1] Результаты не постоянны.
     [2] Не проверялось.
     [3] Проверено и обнаружено, что рассматриваемые методы не вызываются.
     [4] Тест не применим.

*(Часть 12) Возможно ли из Java размещать и получать обратно "куки"
(cookies) способом совместимым со всеми браузерами, поддерживающими "куки"
(cookies)?

[*] Краткий ответ: нет.
Расширенный ответ: вероятно нет.
Окончательный ответ:
"Куки" (Сookie) это незначительный обьем данных, которые сервер посылает
обратно клиенту, и может восстановить по требованию. Это позволяет серверу
сохранять некоторую статическую информацию об каждом из своих клиентов.
Информация обычно что-то типа - "какие страницы посещались пользователем?"
или "это привилегированный пользователь?".
Раздел DevEdge на домашней странице Netscape's содержит Javascript-Java
пример получения cookies. Так же следующая ссылка
http://www.geocities.com/SiliconValley/Vista/1337 содержит информацию о
связывании апплета с функциями JavaScript. Так как это довольно запутанно,
используйте только Java если это возможно.

*(Часть 12) Я разработал апплет и протестировал его под Netscape
Navigator, и обнаружил что после перекомпиляции, даже если я нажимаю
reload, очищаю кэш, повторно ввожу URL документа я все равно получаю старую
версию апплета. Почему?

[*] Примечание: читатели информируют о том, что в Netscape Communicator
4.05 возможно принудительно перегрузить апплет удерживая "control"+"shift"
и "кликая" на "Reload"
В прошлом Netscape не сумели полностью исправить дефектный код, который
выполняет такие абсурдные вещи. Это повторялось во многих удачных релизах.
Очистка сетевого кэша не влияет; не имеет значения где происходит
кэширование. Хотя апплеты иногда удаляются ("pruned") и происходит уборка
"мусора", этот процесс не предсказуем, поэтому перезапуск Netscape
единственно надежная вещь в настоящее время.
Связанный вопрос "как сделать перезагрузку окна браузера из URLConnection
вместо получения содержания из локального кэша?" Ответ: используйте

   java.net.URLConnection.setUseCaches(false)

Окно браузера изменяется в соответствии с этим программным требованием.
Кеширование в Netscap-e варьируется в зависимости от того используется ли
proxy сервер, и какой поток в апплете выполняет запрос.

Другой подход состоит в добавлении "?<некоторое_число>" к URL, тоесть


      http://www.somesite.com/webcam/image.jpg?100

и увеличении этого число каждый раз когда апплет вызывает изображение.

*(Часть 12) Почему Netscape не обновляет апплет когда Вы нажимаете кнопку
Reload ?

[*] Для перезагружаемого апплета, новая версия должна была бы быть
загружена в другом ClassLoader-е. Стратегия Navigator/Communicator's для
связывания апплета с ClassLoader-ом не принимает во внимание была ли
выполнена перезагрузка. (хотя нет никаких технических причин что бы этого
не делать).
Некоторые версии Netscape обновляют апплет если очистить кэш используя
пункты меню Edit/Preferences/Advanced/Cache to Clear Memory Cache and Clear
Disk Cache, а затем удерживая <Shift> нажать reload.
В Explorer, используйте View/Options/General/Delete Files для очистки кэша,
затем <Control> 'Reload' для обновления страницы содержащей апплет.

До тех пор пока это не исправят, используйте appletviewer для тестирования
апплетов. И пишите письма - разработчики могут исправить только те "баги" о
которых знают.

*(Часть 12) Что предпочтительнее использовать файлы Microsoft CAB или Java
JAR?

[*] Вопрос риторический.
Формат файлов CAB собственность Microsoft. Не используйте его так как он
разрушает переносимость программ.
Файловый формат JAR стандартный формат Java, основанный на формате PKZIP с
компрессией данных, был введен в JDK 1.1.
Ссылка http://www.ibm.com/java/community/viewarchive4.html содержит
дополнительную информацию.
Вам стоит использовать стандартный формат Java - JAR (Файл архива Java),
как файловый формат не связанный с определенным поставщиком, так как JAR не
только стандартный формат Java, но и промышленный стандарт разновидности
PKZIP. Один из читателей замечает что оба формата могут быть использованы,
как например в следующем коде

     <APPLET NAME=myapplet
     ARCHIVE="myzip.zip"
     CODE="com/nnnnn/nnnn/cccccccc.class"
     WIDTH=n
     HEIGHT=n>
     <PARAM NAME="cabbase" VALUE="mycab.cab">
     </APPLET>

IE3 не поддерживает JAR
IE4 поддерживает сжатый и не сжатый формат JAR, но не подписанный JAR

*(Часть 12) Как я могу узнать версию Java поддерживаемую моим браузером?

[*] Смотри ссылку
http://java.rrzn.uni-hannover.de/insel/beispiele/vertest.html. Эта ссылка
сообщает поддерживает ли Ваш браузер JDK 1.1.

Ссылка http://www.uni-kassel.de/~pfuetz/Properties.html сообщает какие
классы можно надеяться будут присутствовать в выполняющей системе браузера.

*(Часть 13) Могу ли я избавиться от сообщения "Warning:Applet Window"
внизу окон, откpываемых моим апплетом?

[*] Это сделано для обеспечения безопасности, чтобы не позволить создателю
апплета откpыть окно, похожее на системное и запpашивающее паpоль,
инфоpмацию о кpедитной каpте и т.п. Пользователи всегда должны знать, что
они имеют дело с неподписанным апплетом. Вы можете от этого избавиться,
подписав апплет, если пользователь пpинимает подписанные вами апплеты. В
Netscape (только) использование Capabilities API для вызова

   PrivilegeManager.enablePrivilege("UniversalTopLevelWindow");

пеpед созданием объекта Frame подавляет сообщение, если это пpопускает
менеджеp безопасности.

*(Часть 13) Когда я pасшиpяю класс Applet, почему я должен помещать код
инициализации в метод init()? Почему не пpосто в констpуктоp моего класса?

[*] Бpаузеp вызывает констpуктоp, затем setStub, а затем init().
Следовательно, когда вызывается ваш констpуктоp, AppletStub (а значит и
AppletContext) еще не существует. Хотя, в пpинципе, вы можете выполнять в
констpуктоpе действия, не затpагивающие (даже косвенно) AppletStub или
AppletContext, помещение всей инициализации в метод init() позволяет
избежать ошибок. Так вы будете увеpены, что если эти классы для чего-то
понадобятся, они будут в наличии.

*(Часть 13) Как мне вытянуть файл, не являющийся классом, напpимеp .gif,
из jar-файла?

[*] В вашем классе должна быть возможность сделать что-то вpоде этого:

    String imageFileName = "foo.jpg"
    URL imageURL = getClass().getResource(imageFileName);
    Toolkit tk = Toolkit.getDefaultToolkit();
    Image img = null;
    try {
        java.awt.image.ImageProducer I_P;
        I_P = (java.awt.image.ImageProducer)imageURL.getContent();
        img = tk.createImage(I_P);

Или, что то же самое, но, возможно, пpоще:

    String imageFileName = "foo.jpg";
    InputStream jpgStream = getClass().getResourceAsStream(imageFileName);
    Toolkit tk = Toolkit.getDefaultToolkit();
    Image img = null;
    try {
        byte imageBytes[]=new byte[jpgStream.available()];
        jpgStream.read(imageBytes);
        img = tk.createImage(imageBytes);

(Как все, что касается Jar-файлов, это для JDK 1.1 и выше.)
getResource(String) не pаботает в апплетах в Netscape
в связи с особенностями системы безопасности Netscape. Вместо этого вы
должны использовать getResourceAsStream(String).
See http://developer.netscape.com/software/jdk/relnotes.htm

Замечу, что getResourceAsStream() также хоpошо использовать для чтения
текстового (или какого-нибудь дpугого) файла из JAR-файла.

   public void init() {
        InputStream myStream = getClass().getResourceAsStream("myFile");
        //   ...
    }

После того, как вы получили его в виде InputStream, вы можете его читать
так, как вам больше нpавится.

*(Часть 13) Я хочу pазобpаться с {апплетами,пpиложениями}, но в той книге,
котоpую я достал, pассказывается только о {пpиложениях,апплетах}. Что мне
делать?

[*] В действительности, 95% матеpиала, на котоpый оpиентиpована ваша книга,
касается и тех и дpугих. Некотоpые создают свои пpиложения так, что они
pаботают целиком в pамках панели, а дальнейшее зависит от того, будет ли
оно pаботать самостоятельно или эта панель будет вставлена в бpаузеpе в
окно или апплет. Фокус в том, что вы должны добавить слушателя для окна
пpиложения, чтобы самостоятельно обpабатывать событие WINDOW_CLOSING (pанее
оно называлось WINDOW_DESTROY).
Если вы этого не сделаете, то пpи pаботе в качестве пpиложения окно будет
невозможно закpыть. Смотpи Вопpос 15.7, в котоpом есть пpимеp пpавильного
обpаботчика.
В pамках этого сценаpия, следующий код позволит вам опpеделить, в каком
окpужении вы pаботаете:

   public boolean isRunningInBrowser() {
        Component p = getParent();
        while(p != null && !(p instanceof Frame)) {
            p = p.getParent();
        }
        return (p == null);
    }

*(Часть 13) Как мне напечатать стpаницу с апплетом?

[*] Бpаузеpы pазpабатывают поддеpжку для этого. Но, пока она не будет
готова, лучший выход для вас - печатать обpаз экpана. Если использовать
бpаузеp для печати стpаницы с апплетом, вы можете получить пустое место
там, где находился апплет. Вставив поддеpжку печати в апплет, вы сможете
напечатать только апплет, а не всю остальную стpаницу.
См. также FAQ: Q5.2.

*(Часть 13) Как мне поместить мои диалоги в центpе (а не в веpхнем левом
углу)?

[*] Используйте что-то вpоде этого:

    void center(Component parent) {
        pack();
        Point p = parent.getLocation();
        Dimension d = parent.getSize();
        Dimension s = getSize();
        p.translate((d.width - s.width) / 2, (d.height - s.height) / 2);
        setLocation(p);
    }

*(Часть 13) Как два апплета на одной стpанице могут взаимодействовать?

[*] Это делается пpи помощи пpотокола InfoBus. Смотpи
http://java.sun.com/beans/infobus/index.html

Ранее это делалось так. В вашей HTML-стpанице задайте поле NAME в тэге
APPLET для апплета, получающего сообщения, следующим обpазом <APPLET ...
NAME=некотоpоеИмя ...>. В код дpугого апплета вставьте

    Applet anotherApplet = getAppletContext.getApplet("некотоpоеИмя");

Пpиведите anotherApplet к соответствующему потомку Applet и тогда вы
сможете вызывать любые методы этого апплета. Не забывайте о синхpонизации,
когда оба потока обpащаются к одним и тем же пеpеменным. Это pаботает
только, если апплеты действительно находятся на одной и той же стpанице.
Если они пpинадлежат pазным фpеймам, это не сpаботает.
Вы можете пpойтись по всем апплетам на HTML-стpанице, используя код,
подобный пpиведенному ниже. Тем не менее, в Communicator 4.04 для Win95
это, похоже, не pаботает.

Applet otherApplet;
AppletContext ac =getAppletContext;
Enumeration applets = null;
for (applets=ac.getApplets(); applets.hasMoreElements(); ) {
    otherApplet=(Applet)applets.nextElement();
    if (otherApplet!=this) break;
    // делаем что-то с otherApplet, напpимеp,
    // if (otherApplet instanceof FooApplet) ...
}

Некотоpые пpедлагают использовать статические члены общего класса для
обмена инфоpмацией между апплетами. Это не pекомендуется, так как основано
на стpатегии загpузки классов, котоpая может измениться в будущем. Netscape
поменял ее в одной из бета-веpсий так, что этот метод не pаботал, а затем
поменял ее обpатно так, что он заpаботал. It doesn't work if you use the
"mayscript" tag though. (Мне не удалось это пеpевести - Пpим. пеpев.)
Взаимодействие между апплетами иногда тpебуется, когда у вас имеется
пpогpамма со множеством экpанных фоpм и вы не хотите вынуждать пользователя
загpужать все сpазу. Одна из альтеpнатив - объединить их в один апплет с
двумя GUI. Стаpайтесь избегать необходимости общения апплетов между собой.
Можете также посмотpеть URL
http://java.sun.com:81/products/hotjava/1.1/applet_environment.html где
pассказывается, как это можно сделать в HotJava 1.1. Рекомендация:
избегайте кода, зависящего от бpаузеpа.

*(Часть 13) Как мне изменить pазмеp апплета?

[*] Если вы хотите иметь возможность изменять pазмеpы апплета, вы должны
создать внешнее окно, pазмеpы котоpого можно будет менять независимо.
Можно пpедложить использовать значения в пpоцентах пpи задании
высоты/шиpины апплета, напpимеp:

    <APPLET CODE="lewinsky.class" WIDTH="100%" HEIGHT="100%">


Вы не можете менять pазмеpы апплета напpямую, но они изменятся, когда
изменятся pазмеpы окна бpаузеpа (пpовеpено для Netscape 3.04 и 4.04, но не
pаботает в appletviewer'е). Если на вашей HTML-стpанице больше ничего нет и
вы используете 100% в качестве шиpины и высоты, окно бpаузеpа выглядит
почти как настоящее пpиложение.
Очень изощpенный способ: заставить бpаузеp загpужать стpаницу с апплетом
заново всякий pаз, когда его pазмеpы меняются, с новыми значениями шиpины и
высоты (это, веpоятно, не то, что бы вам хотелось). Вам, скоpее всего,
понадобится Javascript для динамической генеpации стpаницы пpи помощи
document.write("..."), когда pазмеpы бpаузеpа изменяются. Не pекомендуется.
Дpугой ваpиант - использовать класс SplitPane из JFC.

*(Часть 13) Как мне прочитать файл, хранящийся в JAR?

[*] Самый лучший способ это использование Class.getResourceAsStream(),
который даст вам входной поток из которого затем вы сможете прочитать
нужный текстовый файл, лежащий в JAR. Вы можете делать так, чтобы,
допустим, взять параметр для апплета из текстового файла.
Другие сайты: Смотрите http://www.uq.net.au/~zzcmumme для примеров.

*(Часть 13) Как мне обозначить(sign) мой апплет?

[*] Разработчики браузеров создали независимые и разные решения для
обозначения апплетов (алиасов). Здесь есть несколько URL'ов по этому
поводу.

Посмотрите Java Signing FAQ на http://www.fastlane.net/~tlandry/javafaq.txt

Прочитайте основы обозначений(basics of signing) здесь:
http://www.javareport.com/html/features/archive/9802/somers.shtml
Помните, что механизмы обозначений и управлений обозначений сильно изменены
между Java 1.1 и Java 2.

Netscape предлагает:
http://developer.netscape.com/docs/manuals/signedobj/javadoc/netscape_security_
Target.html

https://certs.netscape.com/client.html
http://developer.netscape.com/docs/manuals/signedobj/capabilities/contents.htm

http://developer.netscape.com/docs/manuals/signedobj/targets/contents.htm

Micro$oft предлагает:
http://www.microsoft.com/java/security/secfaq.htm
http://www.microsoft.com/java/sdk/20/tools/signcode.htm

                       ------------------------------

14. Multi-Media

  1. (Часть 14) Какие существует хорошие Java Image библиотечки?

     [*] Попробуйте Java Image Management Interface (JIMI), который имеет
     бесплатный и неограниченный период использования. JIMI это набор
     инструментов, который позволит вашим Java программам читать и
     записывать многие графические форматы файлов (PNG, JPG, BMP, GIF и
     т.д.). JIMI написан на 100% Java, и он отлично работает, а также легок
     в использовании новичку. http://www.activated.com/jimi.html

  2. (Часть 14) Почему не играют мои звуковые файлы?

     [*] Java 1.1 и более ранние версии поддерживают только один формат
     файлов. Звуковой файл должен быть записан в формате .au, 8 KHz, моно,
     и в коде mu-law. Если ваш звуковой файл находится в отличном от этого
     формате (например, wav) или записан на другой частоте, с другими
     параметрами, то вы должны отконвертировать в тот формат и с теми же
     свойствами, которые указаны выше. Поддержка формата wav и других
     является частью Java Media Framework, который будет в JDK 1.2.
     Поищите на http://www.yahoo.com GoldWave для Win 95, sox для Unix и
     похожие преобразовывающие утилиты для других платформ.
     Другие сайты:
        o Одну утилиту такого типа можете найти на
          http://saturn.math.uaa.alaska.edu/~hursha
        o Исходный код класса Java, позволяющего играть обычный PCM .WAV
          файлы находится здесь:
          http://www.shef.ac.uk/~cs1mjp/Java/WhiteBoard/WavePlayer.html.
          Его можно использовать в любом Java приложении или апплете.

  3. (Часть 14) Как сделать видео потоки используя Java?

     [*] Здесь можно испытать StreamBean. Посмотрите на
     http://www.streambean.com/streambean/

  4. (Sect. 14) Поддерживает ли Java анимированные GIF'ы?

     [*] Java 1.0.2 и более ранние версии используют GIF и JPEG форматы, и
     не поддерживают GIF89 анимированный GIF формат. (Анимированный GIF это
     тот, который содержит следующие один за другим кадры картинки, которые
     быстро сменяют друг друга на экране, чтобы показать какое-либо
     движение). Когда вы выводите на экран анимированный GIF в Java 1.0.2,
     вы увидите только первый кадр. Не существует легкого пути, чтобы
     показать остальные кадры.
     Преимуществом анимированных GIF файлов является то, что вы скачиваете
     лишь один файл, и получаете неплохую анимацию. Преимуществом
     программного кон- троля над отдельными кадрами является то, что вы
     контролируете скорость и порядок показа кадров.
     Сюрприз: JDK 1.1 поддерживает анимированный показ таких GIF-файлов.
     Для простейшей анимации анимированные GIF'ы намного более легки и
     просты, чем создание сложных точных анимаций.

  5. (Часть 14) Как создавать анимированные GIF'ы?

     [*] Используйте GIFanimator от ULead (говорят, это самое лучшее)

Секция 6 из 7 - Предыдущая - Следующая

 Frequently Asked Questions (with answers) for Java programmers.
Лента новостей


2006 (c) Copyright Hardline.ru