JApplets: загрузка изображений - PullRequest
0 голосов
/ 09 декабря 2010

После 1 года работы на Android я немного устала от традиционного графического интерфейса Java.

Мне нужно знать 2 вещи, как я открываю изображения

, но сначаланекоторый код

/**
     * Load the image for the specified frame of animation. Since
     * this runs as an applet, we use getResourceAsStream for 
     * efficiency and so it'll work in older versions of Java Plug-in.
     */
    protected ImageIcon loadImage(String imageNum, String extension) {
        String path = dir + "/" + imageNum+"."+extension;
        int MAX_IMAGE_SIZE = 2400000;  //Change this to the size of
        //your biggest image, in bytes.
        int count = 0;
        BufferedInputStream imgStream = new BufferedInputStream(
                this.getClass().getResourceAsStream(path));
        if (imgStream != null) {
            byte buf[] = new byte[MAX_IMAGE_SIZE];
            try {
                count = imgStream.read(buf);
                imgStream.close();
            } catch (java.io.IOException ioe) {
                System.err.println("Couldn't read stream from file: " + path);
                return null;
            }
            if (count <= 0) {
                System.err.println("Empty file: " + path);
                return null;
            }
            return new ImageIcon(Toolkit.getDefaultToolkit().createImage(buf));
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

И я называю это так

loadImage("share_back_img_1_512", "jpg");

Моя проблема: Как сделать его более динамичным.

На данный момент я тестируюна нескольких изображениях, но у меня есть что-то вроде 100 изображений для окончательного апплета.

Мне пришлось хранить изображения в пакете, чтобы иметь к ним доступ.

, так что вот вопрос:

Есть ли способ загрузки изображений в зависимости от содержимого пакета?получить имя, размер, расширение ...?

В основном более простой способ создания ImageIcons

1 Ответ

1 голос
/ 09 декабря 2010

То, как вы написали свой поток чтения - это может привести к частичному чтению, поскольку не гарантируется, что только один вызов read вернет все байты, которые поток может в конечном итоге произвести.

Попробуйте Apache commons IOUtils # toByteArray (InputStream) или добавьте свой собственный простой служебный метод:

public static final byte[] readBytes(final InputStream is) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream(Short.MAX_VALUE);
    byte[] b = new byte[Short.MAX_VALUE];
    int len = 0;
    while ((len = is.read(b)) != -1) {
        baos.write(b, 0, len);
    }
    return baos.toByteArray();
}

Что касается ваших организационных проблем ... не существует простого + надежного способа получить "список каталогов" содержимого пакета. Пакеты могут быть определены для нескольких записей пути к классам, охватывающих JAR-файлы и папки и даже сетевые ресурсы.

Если пакеты, о которых идет речь, содержатся в одном JAR-файле, вы можете подумать над тем, что описано здесь: http://www.rgagnon.com/javadetails/java-0513.html

Более надежным и переносимым способом может быть сохранение текстового файла, который содержит список изображений для загрузки. Загрузите список как ресурс, затем используйте список для зацикливания и загрузки всех изображений, перечисленных в текстовом файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...