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







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

Frequently Asked Questions (with answers) for Java programmers.

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

     http://www.ulead.com, или GIF Construction Set от Alchemy Mindworks

  6. (Часть 14) Как мне помешать анимированным GIF'ам мелкать при выводе на
     экран ?

     [*] Похоже, проблема в том, что в вашем методе рисования вы делаете
     так:

         g.drawImage(img, ix, iy, this);


     Следует делать вот так:

         g.drawImage(img, ix, iy, getBackground(), this);


     Это изменит все прозрачные места картинки на цвет заднего плана перед
     выводом картинки на экран. Если вы будете выводить прозрачные напрямую
     на экран, то они будут мерцать.
     Если это не помогает, тогда проверьте используется ли imageUpdate

     public boolean imageUpdate(Image img, int flags, int x, int y,
                   int width, int height) {
             if ((flags & (FRAMEBITS|ALLBITS))!= 0) repaint();
             return (flags & (ALLBITS|ABORT)) == 0;
     }


     update это

         public void update(Graphics g) { paint(g); }


     Если у вас есть фоновая картинка, находящаяся за частично прозрачным
     анимированным GIF'ом, то вам придется делать двойной буфер. Вы можете
     кадрировать фоновое изображение для того, чтобы не использовать
     двойной буффер всего приложения и не занимать слишком много памяти.

  7. (Часть 14) Поддерживает ли Java прозрачные GIF'ы?

     Картинки GIF89a с прозрачным фоном покажутся как прозрачные без
     дальшейшей фильтрации. Это поддеживается начиная с версии 1.0. Java
     корректно выводит и анимированные GIF'ы и прозрачные GIF'ы.
     Вы можете заполнить прозрачные пикселы цветом (так как они появляются
     не-прозрачными в Java ). Просто сделайте точное заполнение цветом.

         drawImage(img, x, y, w, h, fillcolor, this);


     Далее, вы можете отфильтровать пикселы изображения для возвращения
     битов, которые вы желаете сделать прозрачными. Однако, большее что вы
     можете сделать это обнаружить что находится под картинкой. Вы не
     можете посмотреть что находится под апплетом(например в самом
     браузере). По умолчанию у апплетов устанавливается простой серый цвет
     на фоне.

  8. (Часть 14) Как я могу проиграть видео на Java?

     [*] Используете Java Media Framework Player API.
     Еще сайты:
        o Спецификацию Java Media Framework Player API можно найти на
          http://java.sun.com/products/java-media/jmf/
        o Intel выпустила SDK для Java Media Framework Player API. Эта SDK
          предлагаетя для Windows 95 и Windows NT. Для большей информации,
          смотрите http://developer.intel.com/ial/jmedia
        o SGI выпустила инструмент JMF для IRIX: Смотри те
          http://www.sgi.com/Products/motion/

*(Часть 14) Какова пpичина этой пpоблемы:

$ appletviewer m.html
Premature end of JPEG file
sun.awt.image.Im...Exception: JPEG datastream contains no image
at sun.awt.image. ... .produceImage(JPEGImageDecoder.java:133)
at sun.awt.image.Inpu...mageSource.doFetch(
                              InputStreamImageSource.java:215)
at sun.awt.image.ImageFetcher.run(ImageFetcher.java:98)

[*] В ранних выпусках JDK не известны баги, которые могут явиться причиной
ошибки при прочтении JPEG на медленных соединениях. Ошибка может появиться
если JPEG содержит большой блок данных приложений (APPn marker) - проблема
проявится в том, что декодер JPEG пытается пропустить мимо APPn и сбивается
если не весь APPn был принято к этому моменту. Приведенное выше сообщение
об ошибке это только одно из нескольких возможных, но в корне они все
одинаковы.
Photoshop это наиболее частый источник JPEG'ов содержащих большие APPn
блоки. В особенности, если Вы позволите Photoshop 4 записать миниатюру
(thumbnail) в JPEG, вместе с ней он запихнет личную пометку APPn
Photoshop'а в несколько K, чего обычно вполне достаточно для получения
ошибки.
Существует несколько возможных решений:

   * Возьмите новый JDK - эту проблему обещают исправить в версии 1.1.
     (Если Вы выкладываете изображения на Web, этого не достаточно для
     решения, так как Вы не сможете принимать только тех посетителей, на
     свой сайт, кто имеет свежую версию Java.
   * Когда создаете JPEG'и для Web используя Photoshop, будьте уверены, что
     выключили опцию "Сохранить минитюру" ("Save thumbnails"). (Это хорошая
     идея на совсем избавиться от бага, потому что миниатюра только трата
     времени перекачки так долго, пока Web браузер не сообразит. Вы можете
     все еще иметь неприятности если у Вас имеются длинные комментарии или
     множество путей сохраненных в файле, но в 99% случаев, избавление от
     миниатюр заставит APPn Photoshop'а достаточно уменьшиться, чтобы не
     вызывать баг Java.
   * Используйте такой инструмент, как 'jpegtran' (от Независимой JPEG
     Группы - Independent JPEG Group) чтобы отрезать APPn Photoshop'а
     всецело без какой-нибудь потери качества при этом. Это реккомендуется
     для тех, кто вынуждены создавать комментарии или еще что-нибудь, что
     займет много места в JPEG файле.
   * (В последнюю очередь) Загрузите и перезапишите картинку в другом
     графическом редакторе, который не вставит лишнюю APPn или другие
     ненужные данные. Это, очевидно, ухудшит ваш JPEG и я не реккомендую
     это тем, кому особенно важно качество изображения.

Любая большая верхняя метка(overhead marker) явится причиной такой же
проблемы; 4K комментариев, скажем, в метке COM. Итак, Photoshop это не
единственный "раздражитель" этого бага.

*(Часть 14) Как я могу преобразовывать GIF и JPEG форматы друг в друга?

[*] Одним словом, никак.
Трудно переделать хорошо работающий JPEG в также хорошую картинку формата
GIF. Иногда, с большим трудом, Вы можете получить приемлемое
преобразование, но в большинстве случаев GIF<->JPEG конвертирование просто
превратит Ваше изображение в "кашу". Лучше будет, если ваши картинки сразу
будут в нужном формате.
Другие решения:

   * Если Вы определенно хотите преобразовать формат изображения,
     попробуйте GBM (Generalized Bitmap Module). Этот пакет имеет GNU
     лицензию, на C, и очень хорош в использовании. Поищите его на
     http://www.interalpha.net/customer/nyangau/
     GBM хорошо конвертирует в JPEG пpактически без потеpи качества. Он
     также преобразовывает из/в около 20 других форматов, делает
     кадрирование(cropping), изменяет размеры, цвета, корректирует гамму,
     полутона, все что хотите. Изначальный исходный код GBM не поддерживает
     JPEG напрямую, но используйте код поддерживающий этот формат от
     IJG(Independent JPEG Group), называемый jpeg-6a и взять его можно
     здесь -
     ftp://sun2.urz.uni-heidelberg.de/pub/simtel/graphics/jpegsr6a.zip
   * Для большей информации смотрите JPEG FAQ на
     http://www.faqs.org/faqs/jpeg-faq/

*(Часть 14) Если есть содеpжащий изобpажение InputStream (большой файл),
как его вывести на экpан без тоpмозов?

[*] Используйте этот метод, и some adroit shuffling.


    Toolkit.getImage(URL url)


Создайте нить(thread) которая будет чем-то вроде http сервера. Заставьте ее
прослушивать какой-нибудь порт (8765 например) на входящие запросы. Когда
нить получит запрос, она просто *смахнет* присвоенные http заголовки и
пустит их в InputStream. Таким образом компонент который имеет входной
поток и должен выполнять getImage(url) теперь может быть вызван:

    Toolkit.getImage("localhost:8765/")


Нить будет действовать как адаптер stream-to-url, и будет выводить на экран
изображение по мере считывания. Это избавит Вас от надобности прочесть 200K
данных из JPEG перед тем, как мы сможете что-либо вывести на экран.

*(Часть 14) Как записывать звуки на Java?

[*] Java Media Framework будет иметь полную поддержку этого, но пока это не
так. JMF 1.0.1 поддерживает лишь проигрывание звука.
JMF 1.0.1 привязан к JDK 1.2, и доступен как отдельный апдейт для JDK 1.1 и
Netscape Communicator 4 с Java 1.1.
Другие сайты:

     Между тем, существуют разработки для Win95/NT доступные на
     http://www.scrawl.com/store/. Они поддерживают 8, 16-бит, стерео,
     моно, 11025, 22050, 44100 Hz запись/проигрывание, загрузку/запись
     файлов .WAV. Вы можете также портировать их для Вашей платформы.

*(Часть 14) Имеет ли Java встроенную поддержку отображения HTML?

[*] JDK 1.1 поддерживает обработку HTML используя несвязанный с ним пакет
JFC 1.1, известный также как Swing. Swing привязан к JDK 1.2. Он понимает
простейшие элементы в HTML (графика, таблицы, текст), которых вполне
достаточно для обычной работы(файлы документации, эл. почта, и др.)
Другие ссылки:

   * JavaBrowser http://www.ii.uib.no/~alexey/jb/index.html Открытый код,
     бесплатно для использования под GNU LGPL лицензией, HTML 2.0 (версия
     стандарта).
   * ICE Browser - Java Bean Component http://www.icesoft.no/ICEBrowser/
     Свободно в собранном виде для использования в бесплатных приложениях.
     Коммерческая лицензия доступна включая исходный код - лицензия за
     небольшие деньги. Маленький HTML клиент! Lightweight! HTML 3.2
   * HotJava HTML Component - Java Bean Component
     http://www.javasoft.com/products/hotjava/bean/index.html $195 за
     личное использование лицензии на программу. HTML 3.2
   * HTML browser (открытый код)
     http://barium.tn.tudelft.nl/people/gool/java/html/Html.html
   * Web Window Browser http://www.opencube.com/example_wwb.htm $139 - без
     исходного кода.
   * jHelp ($20-650) http://w3.nai.net/~rvdi/jhelp/jhelp2/jhelp.html jHelp
     это компонент HTML браузера написанный на Java, HTML 2.0

*(Часть 14) Я загрузил картинку из JPEG/GIF файла используя метод
Toolkit/Applet.createImage(URL/String), и (высота и ширина -1) это не
выводится на экран. Почему?

[*] AWT по умолчанию в этом случае ничего не делает.
Когда картинка впеpвые выводиться с использованием Component.drawImage(),
или ее размер запрошен, изображение начинает загружаться в дpугой нити
(Thread).
Во вpемя загpузки изобpажения, ImageObserver, опpеделенный в обpащении к
drawImage()/getHeight(), будет пеpиодически инфоpмиpоваться о статусе
загpузки изобpажения, путем вызова imageUpdate() метода.
В случае вызова Component.drawImage(), по умолчанию Component.imageUpdate()
должен планиpовать *дополнительный* вызов repaint(), когда изобpажение
будет полностью загpужено. Это означает, напpимеp, что следующий код не
будет pаботать:

    class MyComponent extends Component {
      ...
      public void paint(Graphics g) {
        ImageFilter cropper=new CropImageFilter(0,0,16,16);
        Image cropped_image=createImage(new
        FilteredImageSource(image.getSource(),cropper));
        g.drawImage(image,10,400,this);        // эта стpока работает
         // а эта не работает -
        g.drawImage(cropped_image,400,15,this);
        }
      }


cropped_image не будет готов для рисования, но когда он полностью
создастся, пpоизойдет вызов repaint(), а там еще pаз cropped_image
создается (ууу, батенька...) и так далее.
(Обpатите внимание на то, что создание объектов подобно тому, как в методе
paint(), является очень плохим стилем. Так как это будет пpоисходить
довольно часто, pаботы по сбоpке мусоpа у jvm будет много.
Чтобы обойти эту проблему, Вы можете I) добавить все такие изображения в
MediaTracker и вызывать метод waitForAll(). II) выполнить свой собственный
ImageObserver интерфейс и подождать когда метод imageUpdate() будет вызван
со значением ALLBITS/FRAMEBITS. I) легче, но II) рекомендуется, из-за
появившихся данных о том, что MediaTracker не работает в некоторых средах.
Смотрите также в этом FAQ:

   * Смотрите также Q13.12
   * Посмотрите Q6.4 для примеров как переиспользовать объекты.

*(Часть 14) Как мне записать звук в апплете?

[*] Если у Вас Win95/NT, Вы можете использовать SoundBite - Аудиио Запись в
Апплетах См. http://www.scrawl.com/store/
Он обеспечивает простой доступ к аудио данным в массивах:
short[] left, right;

*(Часть 14) Java поддерживает PNG? Да. PNG - Portable Network Graphics -
обеспечивает беспатентную замену для GIFов и TIFFов. Если Вы сохраняете в
GIF, то не забудьте оплатить авторский гонорар фирме Unisys - см. их
страницу http://www.unisys.com/LeadStory/lzwfaq.html. Этот патент обясняет
почему GIFы - это плохой выбор для создания интернетовских изображений.

PNG формат определен в RFC 1950, 1951, 2083, не обремененных лицензиями или
патентами. См. также спецификацию PNG-1.1 на
ftp://swrinde.nde.swri.edu/pub/png/documents.

PNG формат поддерживается Java Advanced Imaging API, который является
частью Java 1.2 media API.

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

15. Работа в сети и распределенные объекты

                                  Статьи о RMI

  1. (Часть 15) Должен ли я вместо RMI использовать CORBA? Или использовать
     DCOM? Или чего-нибудь еще?

     [*] Если Ваши распределенные программы целиком написаны на Java, то
     RMI обеспечивает более простой механизм, который позволяет пересылку
     данных, исходящих от реальных Java объектов, и автоматическую "сборку
     мусора" удаленных объектов.
     Если Вам нужно подключиться к системе на C++ (или другом языке) или
     Вам нужны специфические CORBA службы, то CORBA - Ваш выбор.
     В июле 1997 года Sun анонсировала тот факт, что RMI начала более тесно
     работать с CORBA. Sun просто добавила в RMI транспортный уровень IIOP
     для поддержки взаимодействия с CORBA. Java программы могут
     использовать RMI для доступа к CORBA объектам через IIOP, - протоколе
     основанном на CORBA и разработанном OMG (Object Management Group). Это
     очень хорошая новость для тех, кто строит гетерогенные системы
     масштаба предприятия, хотя нужны некоторые добавления к IIOP для
     поддержки вещей, которые использует RMI.
     Деятели из Microsoft пытались продвигать DCOM заявляя о том, что RMI
     изменяется или доживает последние дни. Это в корне неверно. RMI API
     остается неизменной в своей текущей форме. Использование DCOM
     ограничивает Вас тем, что код работает только на платформе Wintel, и
     полностью отрицает философию Java "write once, run anywhere"
     ("написано однажды, исполняется везде"). Вы должне будете
     перекомпилировать Ваш DCOM код, чтобы он работал на другой
     Microsoft'овской платформе, типа Compaq (бывшего DEC) Alpha. Вы должны
     остерегаться использования непереносимого, завязанного на одном
     производителе кода. DCOM/DNA имеет ограничения для использования на
     предприятии.
     Другие сайты:
          http://www.javaworld.com/javaworld/jw-10-1997/jw-10-corbajava.html
          это хорошее введение в CORBA в мире Java.
          http://www.objenv.com/cetus сравнение CORBA/RMI.

  2. (Часть 15) Как мне заставить работать RMI между разными доменами?

     [*] Все ответы на вопросы, относящиеся к прокси приведены ниже. Вы
     должны сообщить программе где искать сервер. В этом случае Вы должны
     запускать клиента с опцией:
     -Djava.rmi.server.hostname=hostname.domainname

  3. (Часть 15) Мне кажется, что RMI останавливает свою работу в JDK 1.1.
     Почему такое происходит?

     [*] Похоже что изменились правила того, где клиент ищет stub
     класс(класс-заглушку), делая необходимым сброс Вашего class path на
     клиенте после старта RMI registry. В частности, похоже на то, что rmic
     не был обновлен для нового соглашения "don't need $CLASSPATH for
     current dir" ("не нужен $CLASSPATH для текущего каталога"), в то время
     как копмпилятор был обновлен. Вам лучше явно снять установки
     classpath.
     Другие сайты:
     Есть несколько очень хороших источников от Sun, которые охватывают
     много простых и сложных RMI проблем.
        o Конечно, документация:
          http://java.sun.com/products/jdk/1.1/docs/guide/rmi/index.html
        o FAQи посвященные RMI и сериализации объектов
          http://java.sun.com/products/jdk/rmi/faq.html
        o Список рассылки RMI-USERS@JAVASOFT.COM, архив которого находится
          на http://chatsubo.javasoft.com/email/rmi-users/ Посетите архив!

  4. (Часть 15) После определенного числа соединений клиентов RMI к серверу
     (55 на моей системе), последующие попытки RMI соединения неудачны.
     Почему?

     [*] Вы использовали лимит по умолчанию в 64 дескриптора открытых
     файлов. Попытайтесь увеличить лимит в Вашей ОС.
     Существует практический лимит RMI соединений, который налагается
     масштабируемостью вииртуальной машины и производительностью
     сериализации объектов. Это все исправлено в JDK 1.2. Актуальное число
     активных клиентов, которое Вы можете обслуживать будет зависеть от
     суммарной загрузки (workload mix) (т.е. от числа клиентов, как часто
     они обращаются к серверу, и сколько работы выполняется при одном
     обращении).

  5. (Часть 15) Я использую RMI под Win95, и вызов Naming.lookup()
     выполняется очень долго. Как от этого избавиться?

     [*] (См. также первый ответ в нижеследующей секции, и отметьте, что
     эта доработка в Windows у некоторых никогда не работает) Попытайтесь
     добавить запись о машине в Ваш файл "hosts". Обычно этот файл
     называется c:\windows\hosts (если он не существует, то должен быть
     файл c:\windows\hosts.sam). Файл hosts ищется стеком TCP/IP перед
     обращением к DNS, таким образом добавление записи может значительно
     ускорить Ваши поиски (lookups). Файл hosts используется чтобы отразить
     цифровые IP адреса на символьные. Чтобы Для того, чтобы указать имя
     хоста "localhost" с адресом 127.0.0.1 (IP loopback адрес) добавьте
     следующую строчку в Ваш файл hosts.

     127.0.0.1 localhost

                            Работа с сетью в Windows

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

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


2006 (c) Copyright Hardline.ru