Javenue logo

Javenue

Программирование на Java

Информационные технологии

Java Игра Меморина на Swing и проблема с ImageIcon

[Статья вскоре будет обновлена и исходный код игры будет доступен публично.]

Ну прямо гейм-девелопер какой-то.

Попросили меня написать маленькую игрушку с использованием графической библиотеки Java Swing. Игра всем знакома и называется "Меморина". Думаю, заказчик не будет сильно зол за то, что я выложу игру на всеобщее обозрение...

Еще столкнулся с такой проблемой: при загрузке картинок из jar-файла возникает исключительная ситуация ImageFormatException, хотя при запуске из IDE все проходит без ошибок.

Для тех, кому хочется поскорее увидеть игрушку, - memory.zip (54 Kb)

А вот stack-trace того, что я увидел после запаковки классов и иконок в jar:

Premature end of JPEG file
sun.awt.image.ImageFormatException: JPEG datastream contains no image
  at sun.awt.image.JPEGImageDecoder.readImage(Native Method)
  at sun.awt.image.JPEGImageDecoder.produceImage(Unknown Source)
  at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
  at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
  at sun.awt.image.ImageFetcher.run(Unknown Source)

В результате небольшого разбирательства обратил внимание на этот код:

  InputStream is = Memorina.class
        .getResourceAsStream(iconName);
  byte[] buffer = new byte[is.available()];
  is.read(buffer);
  ImageIcon imgIcon = new ImageIcon(buffer);

Экземпляр класса ImageIcon использовался для создания объекта JButton.

Но ImageIcon можно получить и другим способом:

  ImageIcon imgIcon = new ImageIcon(img),

где img - объект Image.

Этот объект можно получить через java.awt.Toolkit. В итоге получаем следующий код, который отлично достает картинки из jar'a:

  URL url = Memorina.class.getResource(iconName);
  Image img = Toolkit.getDefaultToolkit().getImage(url);

Проблема решена.

Жду ваших комментариев и замечаний.


Комментариев: 0

  Выйти

  * для публикации комментариев нужно