⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imagefilefactory.java

📁 MegaMek is a networked Java clone of BattleTech, a turn-based sci-fi boardgame for 2+ players. Fight
💻 JAVA
字号:
/* * MegaMek - Copyright (C) 2004 Ben Mazur (bmazur@sev.org) * *  This program is free software; you can redistribute it and/or modify it *  under the terms of the GNU General Public License as published by the Free *  Software Foundation; either version 2 of the License, or (at your option) *  any later version. * *  This program is distributed in the hope that it will be useful, but *  WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY *  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License *  for more details. */package megamek.client.ui.swing.util;import megamek.common.util.ItemFile;import megamek.common.util.ItemFileFactory;import java.awt.Image;import java.awt.Toolkit;import java.io.BufferedInputStream;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;/** * This class will produce <code>Image</code> objects from files.  If an * image file is inside of JAR and ZIP file, then it must save the contents * to a temporary file. * <p/> * <p/> * Created on January 18, 2004 * * @author James Damour * @version 1 */public class ImageFileFactory implements ItemFileFactory {    /**     * Accepted image file extentions     */    private final static String JPG = "JPG", JPEG = "JPEG", GIF = "GIF", PNG = "PNG"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$    /**     * Implement the Singleton pattern.     */    private ImageFileFactory() {    }    private static ImageFileFactory singleton = null;    /**     * Get the Singleton <code>ImageFileFactory</code>.     *     * @return the Singleton <code>ImageFileFactory</code>.     */    public static ImageFileFactory getInstance() {        if (null == singleton) singleton = new ImageFileFactory();        return singleton;    }    /**     * Get the <code>ItemFile</code> for the given <code>File</code>.     *     * @param file - the input <code>File</code> object that will be read     *             to produce the item.  This value must not be <code>null</code>.     * @return an <code>ItemFile</code> for the given file.     * @throws <code>IllegalArgumentException</code>     *          if the <code>file</code>     *          is <code>null</code>.     */    public ItemFile getItemFile(File file) throws IllegalArgumentException {        // Validate the input.        if (null == file) {            throw new IllegalArgumentException                    ("A null image file was passed."); //$NON-NLS-1$        }        // Construct an anonymous class that gets an Image for the file.        final File entry = file;        return new ItemFile() {            private File file = entry; // copy the file entry            private Image image = null; // cache the Image            public Object getItem() throws Exception {                // Cache the image on first use.                if (null == image) {                    String name = file.getAbsolutePath();                    image = Toolkit.getDefaultToolkit().getImage(name);                }                // Return a copy of the image.                return image.getScaledInstance(84, 72, Image.SCALE_FAST);            } // End getItem()        };    }    /**     * Get the <code>ItemFile</code> for the given <code>ZipEntry</code> in     * the <code>ZipFile</code>.     *     * @param zipEntry - the <code>ZipEntry</code> that will be read     *                 to produce the item.  This value must not be <code>null</code>.     * @param zipFile  - the <code>ZipFile</code> object that contains     *                 the <code>ZipEntry</code> that will produce the item.     *                 This value must not be <code>null</code>.     * @return an <code>ItemFile</code> for the given zip file entry.     * @throws <code>IllegalArgumentException</code>     *          if either the     *          <code>zipEntry</code> or the <code>zipFile</code> is     *          <code>null</code>.     */    public ItemFile getItemFile(ZipEntry zipEntry, ZipFile zipFile)            throws IllegalArgumentException {        // Validate the input.        if (null == zipEntry) {            throw new IllegalArgumentException                    ("A null ZIP entry was passed."); //$NON-NLS-1$        }        if (null == zipFile) {            throw new IllegalArgumentException                    ("A null ZIP file was passed."); //$NON-NLS-1$        }        // Construct an anonymous class that gets an Image for the file.        final ZipEntry entry = zipEntry;        final ZipFile source = zipFile;        return new ItemFile() {            private ZipEntry item = entry; // copy the ZipEntry            private ZipFile zipFile = source; // copy the ZipFile            private Image image = null; // cache the Image            public Object getItem() throws Exception {                // Cache the image on first use.                if (null == image) {                    // Get ready to read from the item.                    InputStream in = new BufferedInputStream                            (zipFile.getInputStream(item),                                    (int) item.getSize());                    // Make a buffer big enough to hold the item,                    // read from the ZIP file, and write it to temp.                    byte[] buffer = new byte[(int) item.getSize()];                    in.read(buffer);                    // Check the last 10 bytes.  I've been having                    // some problems with incomplete image files,                    // and I want to detect it early and give advice                    // to players for dealing with the problem.                    int index = (int) item.getSize() - 10;                    while (item.getSize() > index) {                        if (0 != buffer[index]) {                            break;                        }                        index++;                    }                    if (item.getSize() <= index) {                        throw new IOException                                ("Error reading " + item.getName() + //$NON-NLS-1$                                "\nYou may want to unzip " + //$NON-NLS-1$                                zipFile.getName());                    }                    // Create the image from the buffer.                    image = Toolkit.getDefaultToolkit()                            .createImage(buffer);                } // End get-image                // Return a copy of the image.                return image.getScaledInstance(84, 72, Image.SCALE_FAST);            } // End getItem()        };    }    /**     * The method that must be implemented by any object that filters filenames     * (i.e., selects a subset of filenames from a list of filenames).     * <p/>     * This definition is copied from <code>java.io.FilenameFilter</code>     * for completeness.     *     * @param dir  - the <code>File</code> object of the directory containing     *             the named file.     * @param name - the <code>String</code> name of the file.     */    public boolean accept(File dir, String name) {        // Convert the file name to upper case, and compare it to image        // file extensions.  Yeah, it's a bit of a hack, but whatever.        String ucName = name.toUpperCase();        return (ucName.endsWith(JPG) ||                ucName.endsWith(JPEG) ||                ucName.endsWith(GIF) ||                ucName.endsWith(PNG));    }    /**     * The method that must be implemented by any object that filters filenames     * within a <code>ZipFile</code> (i.e., selects a subset of filenames from     * a list of filenames in a ZIP archive).     *     * @param zipFile - the <code>ZipFile</code> object that contains     *                the named file's entry.     * @param name    - the <code>String</code> name of the file.     */    public boolean accept(ZipFile zipFile, String name) {        // Convert the file name to upper case, and compare it to image        // file extensions.  Yeah, it's a bit of a hack, but whatever.        String ucName = name.toUpperCase();        return (ucName.endsWith(JPG) ||                ucName.endsWith(JPEG) ||                ucName.endsWith(GIF) ||                ucName.endsWith(PNG));    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -