Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Используя Компоненты Swing
Как Использовать Значки
Домашняя страница > Создание GUI С JFC/Swing > Используя Компоненты Swing

Как Использовать Значки

Много компонентов Swing, таких как метки, кнопки, и снабженные вкладками области, могут быть украшены значком — фиксированным - измеренное изображение. Значок является объектом, который придерживается Icon интерфейс. Swing обеспечивает особенно полезную реализацию Icon интерфейс: ImageIcon, который красит значок от ДЖИФА, JPEG, или изображения PNG.

Вот снимок приложения с тремя метками, два украшен значком:

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

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

ImageIcon icon = createImageIcon("images/middle.gif",
                                 "a pretty but meaningless splat");
label1 = new JLabel("Image and Text", icon, JLabel.CENTER);
...
label3 = new JLabel(icon);

createImageIcon метод (используемый в предыдущем отрывке) является тем, который мы используем во многих из наших примеров кода. Это находит указанный файл и возвращается ImageIcon для того файла, или null если тот файл не мог бы быть найден. Вот типичная реализация:

/** Returns an ImageIcon, or null if the path was invalid. */
protected ImageIcon createImageIcon(String path,
                                           String description) {
    java.net.URL imgURL = getClass().getResource(path);
    if (imgURL != null) {
        return new ImageIcon(imgURL, description);
    } else {
        System.err.println("Couldn't find file: " + path);
        return null;
    }
}

В предыдущем отрывке, первом параметре ImageIcon конструктор относительно расположения текущего class, и будет разрешен к абсолютному URL. description параметром является строка, которая позволяет вспомогательным технологиям помогать пользователю со слабым зрением понять, какую информацию значок передает.

Обычно, приложения обеспечивают свой собственный набор изображений, используемых в качестве части приложения, как имеет место с изображениями, используемыми многими из наших демонстрационных примеров. Следует использовать Class getResource метод, чтобы получить путь к изображению. Это позволяет приложению проверять, что изображение доступно и обеспечить заметную обработку ошибок, если это не. Когда изображение не является частью приложения, getResource не должен использоваться и ImageIcon конструктор используется непосредственно. Например:

ImageIcon icon = new ImageIcon("images/middle.gif",
                               "a pretty but meaningless splat");

Когда Вы определяете имя файла или URL к ImageIcon конструктор, обработка блокируется, пока данные изображения полностью не загружаются, или расположение данных, оказалось, было недопустимо. Если расположение данных недопустимо (но ненуль), ImageIcon все еще успешно создается; это только не имеет никакого размера и, поэтому, ничего не красит. Как показано в createImageIcon метод, желательно сначала проверить, что URL указывает на существующий файл прежде, чем передать это к ImageIcon конструктор. Это позволяет корректную обработку ошибок, когда файл не присутствует. Если Вы хотите больше информации, в то время как изображение загружается, можно зарегистрировать наблюдателя на значке изображения, вызывая setImageObserver метод.

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

Остальная часть этого раздела затрагивает следующие темы:

Более сложный Пример Значка Изображения

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

Начальное представление приложения IconDemo.

Попробуйте это: 
  1. Нажмите кнопку Launch, чтобы работать, IconDemo, используя Сеть Java™ Запускаются (загрузите JDK 6 или позже). Или, чтобы скомпилировать и выполнить пример самостоятельно, консультируйтесь, пример индексируют.

    Запускает пример IconDemo
  2. Нажмите на любое из изображений миниатюры, чтобы просмотреть фотографии в натуральную величину.

  3. Содержите мышь по фотографии. Подсказка появляется, который выводит на экран заголовок фотографии.

IconDemoApp демонстрирует значки, используемые следующими способами:

Фотографии загружаются в отдельном потоке loadimages.execute. loadimages код показывают немного позже в этом разделе.

ThumbnailAction class, внутренний class в IconDemoApp.java, потомок AbstractAction это управляет нашим значком полного изображения, версией миниатюры, и ее описанием. Когда actionPerformed метод вызывают, полное изображение загружается в основную область дисплея. У каждой кнопки есть свой собственный экземпляр ThumbnailAction который определяет различное изображение, чтобы показать.

/**
 * Action class that shows the image specified in it's constructor.
 */
private class ThumbnailAction extends AbstractAction{

    /**
     *The icon if the full image we want to display.
     */
    private Icon displayPhoto;

    /**
     * @param Icon - The full size photo to show in the button.
     * @param Icon - The thumbnail to show in the button.
     * @param String - The descriptioon of the icon.
     */
    public ThumbnailAction(Icon photo, Icon thumb, String desc){
        displayPhoto = photo;

        // The short description becomes the tooltip of a button.
        putValue(SHORT_DESCRIPTION, desc);

        // The LARGE_ICON_KEY is actually the key for setting the
        // icon when an Action is applied to a button.
        putValue(LARGE_ICON_KEY, thumb);
    }

    /**
     * Shows the full image in the main area and sets the application title.
     */
    public void actionPerformed(ActionEvent e) {
        photographLabel.setIcon(displayPhoto);
        setTitle("Icon Demo: " + getValue(SHORT_DESCRIPTION).toString());
    }
}

Загрузка Изображений Используя getResource

Чаще всего данные значка изображения прибывают из файла изображения. Есть много допустимых способов, которыми class Вашего приложения и файлы изображений могут быть сконфигурированы на Вашем файловом сервере. У Вас могли бы быть свои файлы class в файле JAR, или Ваши файлы изображений в файле JAR; они могли бы быть в том же самом файле JAR, или они могли бы быть в различных файлах JAR. Следующие числа иллюстрируют несколько из способов, которыми могут быть сконфигурированы эти файлы:

Показ схемы MyDemo. class и images/myImage.png в соответствии с родительским каталогом Показ схемы MyDemo. class и image.jar в соответствии с родительским каталогом
Файл класса рядом с каталогом изображения, содержащим файл изображения, в формате PNG. Файл класса в том же самом каталоге как файл JAR. Файл JAR создавался со всеми изображениями в images каталог.
Схема показывая MyDemo.jar и image.jar в соответствии с родительским каталогом Показ схемы MyDemo. class и images/myImage.png в том же самом файле JAR
Файл класса в одном файле JAR и изображения в другом файле JAR. Класс и файлы изображений в том же самом файле JAR.

Если Вы пишете реальное приложение, это вероятно (и рекомендуемый), что Вы помещаете свои файлы в пакет. Для получения дополнительной информации по пакетам см. Создание и Используя Пакеты в Изучении следа Языка Java. Вот некоторые возможные конфигурации, используя пакет, названный "омегой":

Схема показывая пакет омеги с MyDemo. class и image/myImage.png Схема показывая пакет омеги с MyDemo. class и image.jar
Файл класса в каталоге называют omega. Изображение в omega/images каталог. Файл класса в omega каталог. Изображение в файле JAR не в omega каталог, но создаваемый с omega/images иерархия.
Схема показывая omega.jar, который содержит omega/MyDemo. class и omega/images/myImage.png
Один большой файл JAR с файлами class под omega каталог и файлы изображений под omega/images каталог.

Все семь показанных конфигураций допустимы, и тот же самый код читает изображение:

java.net.URL imageURL = myDemo.class.getResource("images/myImage.gif");
...
if (imageURL != null) {
    ImageIcon icon = new ImageIcon(imageURL);
}

getResource метод заставляет загрузчик class просматривать каталоги и файлы JAR в пути class программы, возвращая URL, как только это находит требуемый файл. В примере программа MyDemo пытается загрузиться images/myImage.png файл от omega class. Загрузчик class просматривает каталоги и файлы JAR в пути class программы для /omega/images/myImage.png. Если загрузчик class находит файл, он возвращает URL файла или каталога JAR, который содержал файл. Если другой файл или каталог JAR в пути class содержит images/myImage.png файл, загрузчик class возвращает первую инстанцию, которая содержит файл.

Вот три способа определить путь class:

Большинство Учебных примеров Swing, вставленных в изображения images каталог в соответствии с каталогом, который содержит файлы class примеров. Когда мы создаем файлы JAR для примеров, мы сохраняем те же самые относительные расположения, хотя часто мы помещаем файлы class в различный файл JAR чем файл JAR изображения. Независимо от того, где class и файлы изображений находятся в файловой системе — в одном файле JAR, или в многократных файлах JAR, в именованном пакете, или в пакете значения по умолчанию — тот же самый код находит использование файлов изображений getResource.

Для получения дополнительной информации см. Ресурсы Доступа Независимым от расположения Способом и Соображениями Разработки приложений.

Загрузка Изображений В Апплеты

Апплеты обычно загружают данные изображения из компьютера, который подавал апплет. APPLET тег - то, где Вы определяете информацию об изображениях, используемых в апплете. Для получения дополнительной информации по APPLET тег видит Используя Тег АППЛЕТА

Улучшение Воспринятой Производительности, Загружая Значки Изображения

Поскольку изображения фотографии могут не спешить доступ, IconDemoApp.java использование a SwingWorker улучшить производительность программы как воспринято пользователем.

Загрузка фонового изображения — программа использует javax.swing. SwingWorker возражают, чтобы загрузить каждое изображение фотографии, и вычислить это - миниатюра в фоновом потоке. Используя a SwingWorker препятствует тому, чтобы программа, казалась, замерзнуть, загружаясь и масштабируя изображения.

Вот код, чтобы обработать каждое изображение:

/**
 * SwingWorker class that loads the images a background thread and calls publish
 * when a new one is ready to be displayed.
 *
 * We use Void as the first SwingWorker param as we do not need to return
 * anything from doInBackground().
 */
private SwingWorker<Void, ThumbnailAction> loadimages = new SwingWorker<Void, ThumbnailAction>() {

    /**
     * Creates full size and thumbnail versions of the target image files.
     */
    @Override
    protected Void doInBackground() throws Exception {
        for (int i = 0; i < imageCaptions.length; i++) {
            ImageIcon icon;
            icon = createImageIcon(imagedir + imageFileNames[i], imageCaptions[i]);

            ThumbnailAction thumbAction;
            if(icon != null){

                ImageIcon thumbnailIcon = new
                     ImageIcon(getScaledImage(icon.getImage(), 32, 32));


                thumbAction = new ThumbnailAction(icon, thumbnailIcon, imageCaptions[i]);

            } else {
                // the image failed to load for some reason
                // so load a placeholder instead
                thumbAction = new ThumbnailAction(placeholderIcon, placeholderIcon, imageCaptions[i]);
            }
            publish(thumbAction);
        }
        // unfortunately we must return something, and only null is valid to
        // return when the return type is void.
        return null;
    }

    /**
     * Process all loaded images.
     */
    @Override
    protected void process(List<ThumbnailAction> chunks) {
        for (ThumbnailAction thumbAction : chunks) {
            JButton thumbButton = new JButton(thumbAction);
            // add the new button BEFORE the last glue
            // this centers the buttons in the toolbar
            buttonBar.add(thumbButton, buttonBar.getComponentCount() - 1);
        }
    }
};

SwingWorker вызывает doInBackground метод в фоновом потоке. Метод помещает полное изображение, изображение размера миниатюры и заголовок в a ThumbnailAction объект. SwingWorker тогда поставляет ThumbnailAction к process метод. process метод выполняется на событии, диспетчеризируют поток, и обновляет GUI, добавляя кнопку к панели инструментов. JButton имеет конструктора, который берет объект действия. Объект действия определяет свойства многой кнопки. В нашем случае значок кнопки, заголовок и действие, которое будет выполнено, когда кнопка нажимается, все определяются ThumbnailAction.

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

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

Создание Пользовательской Реализации Значка

createImageIcon метод возвращает нуль, когда это не может найти изображение, но что программа должна сделать тогда? Одна возможность состояла бы в том, чтобы проигнорировать то изображение и идти дальше. Другая опция должна была бы обеспечить своего рода значок значения по умолчанию, чтобы вывести на экран, когда вещественное число нельзя быть загружен. Создание другого звонка createImageIcon мог бы привести к другому нулю, настолько использующему, который не является хорошей идеей. Вместо этого позволяет, создают пользовательское Icon реализация.

Пример MissingIcon.

Можно найти реализацию пользовательского значка class в MissingIcon.java. Вот интересные части его кода:

/**
 * The "missing icon" is a white box with a black border and a red x.
 * It's used to display something when there are issues loading an
 * icon from an external location.
 *
 * @author Collin Fagan
 */
public class MissingIcon implements Icon{

    private int width = 32;
    private int height = 32;

    private BasicStroke stroke = new BasicStroke(4);

    public void paintIcon(Component c, Graphics g, int x, int y) {
        Graphics2D g2d = (Graphics2D) g.create();

        g2d.setColor(Color.WHITE);
        g2d.fillRect(x +1 ,y + 1,width -2 ,height -2);

        g2d.setColor(Color.BLACK);
        g2d.drawRect(x +1 ,y + 1,width -2 ,height -2);

        g2d.setColor(Color.RED);

        g2d.setStroke(stroke);
        g2d.drawLine(x +10, y + 10, x + width -10, y + height -10);
        g2d.drawLine(x +10, y + height -10, x + width -10, y + 10);

        g2d.dispose();
    }

    public int getIconWidth() {
        return width;
    }

    public int getIconHeight() {
        return height;
    }
}

paintIcon метод передают a Graphics объект. Graphics объект дает paintIcon доступ метода ко всему API Java2D. Для получения дополнительной информации о рисовании и Java2D, см. Выполняющее Пользовательское Рисование.

Следующий код демонстрирует как MissingIcon class используется в SwingWorker doInBackground метод.

private MissingIcon placeholderIcon = new MissingIcon();

...
if(icon != null) {
    ...

} else {
    // the image failed to load for some reason
    // so load a placeholder instead
    thumbAction = new ThumbnailAction(placeholderIcon, placeholderIcon, imageCaptions[i]);
}

Используя пользовательский значок имеет несколько импликаций:

API Значка Изображения

Следующие таблицы приводят обычно используемый ImageIcon конструкторы и методы. Отметьте это ImageIcon не потомок JComponent или даже Component.

API для того, чтобы использовать значки изображения попадает в эти категории:

Установка, Получение, и Рисование Изображения Значка Изображения
Метод или Конструктор Цель
ImageIcon ()
ImageIcon (байт [])
ImageIcon (байт [], Строка)
ImageIcon (Изображение)
ImageIcon (Изображение, Строка)
ImageIcon (Строка)
ImageIcon (Строка, Строка)
ImageIcon (URL)
ImageIcon (URL, Строка)
Создайте ImageIcon экземпляр, инициализируя это, чтобы содержать указанное изображение. Первый параметр указывает на источник — изображение, байтовый массив, имя файла, или URL — из которого должно быть загружено изображение значка изображения. Источник должен быть в формате, поддерживаемом java.awt.Image class: а именно, ДЖИФ, JPEG, или PNG. Второй параметр, когда существующий, обеспечивает описание для изображения. Описание может также быть установлено через setDescription и предоставляет полезную текстовую информацию для вспомогательных технологий.
освободите setImage (Изображение)
Отобразите getImage ()
Набор или вывел на экран изображение значком изображения.
освободите paintIcon (Компонент, Графика, интервал, интервал) Нарисуйте изображение значка изображения в указанном графическом контексте. Вы переопределили бы это, только если Вы реализуете пользовательский значок, который выполняет его собственное рисование. Component объект используется в качестве наблюдателя изображения. Можно положиться на поведение значения по умолчанию, обеспеченное Component class, и передача в любом компоненте. Два int параметры определяют верхний левый угол, где значок красится.
URL getResource (Строка)
в (java.lang. ClassLoder)
Найдите ресурс с именем. Для получения дополнительной информации см., что Загружающиеся Изображения Используют getResource.
InputStream getResourceAsStream (Строка)
в (java.lang. ClassLoder)
Найдите ресурс с именем и возвратите входной поток для того, чтобы считать ресурс. Для получения дополнительной информации см. Загружающиеся Изображения В обсуждение Апплетов.
Установка или Получение информации о Значке Изображения
Метод Цель
освободите setDescription (Строка)
Представьте getDescription в виде строки ()
Набор или получает описание изображения. Это описание предназначается для использования вспомогательными технологиями.
интервал getIconWidth ()
интервал getIconHeight ()
Получите width или height значка изображения в пикселях.
Наблюдение Изображения Значка Изображения Загрузиться
Метод Цель
освободите setImageObserver (ImageObserver)
ImageObserver getImageObserver ()
Набор или получает наблюдателя изображения для значка изображения.
интервал getImageLoadStatus () Получите загружающееся состояние изображения значка изображения. Значения, возвращенные этим методом, определяются MediaTracker.

Примеры то Использование Значки

Следующая таблица приводит только несколько из многих примеров то использование ImageIcon.

Пример Где Описано Примечания
LabelDemo Этот раздел и
Как Использовать Метки
Демонстрирует, как использовать значки в метке приложения, с и без сопутствующего текста.
IconDemo Этот раздел Использует метку, чтобы показать большие изображения; кнопки использования, у которых есть оба изображения и текст.
CustomIconDemo Этот раздел Использует пользовательский значок class, реализованный ArrowIcon.java.
TumbleItem Как Сделать Апплеты Апплет. Использование отображает значки в анимации. Шоу, как вызвать ImageIcon's paintIcon метод.
ButtonDemo Как Использовать Кнопки, Флажки, и Переключатели Шоу, как использовать значки в кнопках приложения.
CheckBoxDemo Как Использовать Флажки Использование многократные изображения ДЖИФА.
TabbedPaneDemo Как Использовать Снабженные вкладками Области Демонстрирует, как добавлять значки к вкладкам в снабженной вкладками области.
DialogDemo Как Сделать Диалоговые окна Шоу, как использовать стандартные значки в диалоговых окнах.
TreeIconDemo Как Использовать Деревья Шоу, как изменить значки, выведенные на экран узлами дерева.
ActionDemo Как Использовать Действия Шоу, как определить значок в кнопке на панели инструментов или пункте меню, используя Action.
FileChooserDemo2 Как Использовать Селекторов Файла Использование a PNG изображение. Шоу, как реализовать предварительное средство просмотра изображения и изображение, просачиваются селектор файла.

Отметьте: фотографии, используемые в IconDemo авторское право ©2006 spriggs.net и лицензируемый в соответствии с Творческой Лицензией палаты общин.

Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Использовать Модели
Следующая страница: Как Использовать Границы