Icon и ImageIcon – использование иконок в Java Swing

Icon и ImageIcon - использование иконок в Java Swing Некоторые компоненты Java Swing поддерживают иконки. Например, у кнопок, текстовых меток или у пунктов меню могут быть установлены иконки. На рисунке можно посмотреть внешний вид тестового приложения, у которого для кнопки и для текстовой метки установлены иконки. Это стандартные иконки Java Swing.

Для установки иконки используется метод setIcon, которому в качестве параметра передается ссылка на Icon. Можно воспользоваться классом ImageIcon для загрузки своих собственных изображений. ImageIcon реализует интерфейс Icon, поэтому кактолько ImageIcon создан, можно смело передавать его методу setIcon. ImageIcon может использоваться для GIF, JPEG и PNG изображений. При создании объекта ImageIcon в качестве параметра конструктору необходимо передать путь к рисунку. Путь к рисунку может быть абсолютный или относительный.

Вообще есть несколько вариантов того, где должны храниться файлы рисунков. Первый вариант -приложение на Java для удобства распространения можно собирать в jar архив. Все рисунки также помещать jar архив. У такого варианта есть неоспоримый плюс, приложение – это один файл. Всё, что нужно приложению для успешной работы будет в этом jar файле. С другой стороны иногда полезно, чтобы рисунки и ресурсные файлы были доступны без каких-то хитрых манипуляций. В случае с jar файлом ресурсы также доступны, но нужно производить разархивацию (jar – это zip архив) , затем менять нужные файлы и в конце концов собирать обратно. Второй вариант — можно не выполнять компоновку всего приложения в jar фал, а написать некий bat’ник, который будет запускать Main класс приложения. И наконец третий — рисунки вынести в отдельную директорию, например images, которая будет находиться там же, где jar архив приложения. Посмотрим разные случаи.

Обратимся к коду тестового примера. Здесь имеется класс TestFrame. В той же директории, в которой находится TestFrame, располагается несколько рисунков. Требуется подгрузить их и отобразить в качестве иконок. Делается это при помощи вот такой конструкции.

String path = "icon1.png";
URL imgURL = TestFrame.class.getResource(path);
ImageIcon icon = new ImageIcon(imgURL);

Еще раз отмечу, при использовании такого метода необходимо, чтобы рисунки находились в той же директории, где и сам класс. Ну или путь к рисунку path должен быть, к примеру, “images/icon1.png”, а в директории, в которой располагается TestFrame должна находитться папка images с рисунком icon1.png. Например вот так рисунки располагались у меня в проекте, чтобы работал приведеный выше код.

Icon и ImageIcon - использование иконок в Java Swing

Второй вариант – располагать рисунки вот так.

Icon и ImageIcon - использование иконок в Java Swing

Приложение представляет собой архив text.jar, а рисунки располагаются в директории images, которая находится в той же директории, что и архив. Тогда загружать рисунки для иконок можно вот так.

ImageIcon icon = new ImageIcon("images/icon3.png");

В тестовом приложении используются оба метода загрузки изображений. Для первых двух иконок изображения достаются из jar архива приложения, для третьей – изображение берется из директории images. Внешний вид тестового приложения представлен на рисунке ниже.

Icon и ImageIcon - использование иконок в Java Swing

Тестовые рисунки icon1.png, icon2.png и icon3.png

Код тестового приложения.

import java.awt.Dimension;
import java.net.URL;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class TestFrame extends JFrame {

	public static void createGUI() {
		JFrame frame = new JFrame("Test frame");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		JPanel panel = new JPanel();		

		JButton button1 = new JButton();
		ImageIcon icon1 = createIcon("icon1.png");
		button1.setIcon(icon1);
		panel.add(button1);
		
		
		JButton button2 = new JButton();
		ImageIcon icon2 = createIcon("icon2.png");
		button2.setIcon(icon2);
		panel.add(button2);
		
		JButton button3 = new JButton();
		ImageIcon icon3 = new ImageIcon("images/icon3.png");
		button3.setIcon(icon3);
		panel.add(button3);

		frame.getContentPane().add(panel);
		frame.setPreferredSize(new Dimension(390, 135));
		frame.pack();
		frame.setLocationRelativeTo(null);
		frame.setVisible(true);
	}
	
	protected static ImageIcon createIcon(String path) {
		URL imgURL = TestFrame.class.getResource(path);		
		if (imgURL != null) {
			return new ImageIcon(imgURL);
		} else {
			System.err.println("File not found " + path);
			return null;
		}
	}


	public static void main(String[] args) {
		javax.swing.SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame.setDefaultLookAndFeelDecorated(true);
				createGUI();
			}
		});
	}
}
Advertisements

8 Responses to Icon и ImageIcon – использование иконок в Java Swing

  1. badmod says:

    СПАСИБО БОЛЬШОЕ!!!

  2. cyper_ says:

    Вариант:

    String path = «icon1.png»;
    URL imgURL = TestFrame.class.getResource(path);
    ImageIcon icon = new ImageIcon(imgURL);

    — является кроссплатформенным. Дело в том что, например в Линуксе, при запуске программы не из консоли текущий каталог может оказаться не каталогом где лежит jar файл, а текущий каталог пользователя — System.getProperty(«user.home»), в котором может не оказаться графических файлов и никакого рисунка Вы на кнопке не увидите…

    • bondforever says:

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

  3. cyper_ says:

    Да, такой вариант должен корректно работать на ВСЕХ платформах.
    Но при запуске программы, из IDE Netbeans например, иконок на кнопке тоже не будет, так как программа на выполнение запускается не через jar файл :), а после компиляции/сборки — пожалуйста…

  4. cyper_ says:

    Упс, ошибочка, в IDE Netbeans тоже корректно все работает, проверял :). Но раньше почему то у меня такое было…

  5. bkm says:

    может тут кто-то ещё бывает, у меня такой вопрос, а как загрузить в ImageIcon не всю картинку,а её часть? т.е. в одном файле png держать все кнопки, а в программе нарезать каждую в отдельный ImageIcon. как это сделать проще всего?

    понимаю, что можно хранить 20-30 файлов отдельно, но вопрос остаётся)) спасибо

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: