blob: 8e0c99b2adea4109755f9fa5568ef367a0c0837a [file] [log] [blame]
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
//
= Обработка изображений в приложении с графическим интерфейсом
:jbake-type: tutorial
:jbake-tags: tutorials
:jbake-status: published
:icons: font
:syntax: true
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Обработка изображений в приложении с графическим интерфейсом - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Обработка изображений в приложении с графическим интерфейсом
image::images/netbeans-stamp-80-74.png[title="Содержимое этой страницы применимо к IDE NetBeans 7.4 и 8.0"]
*Для работы с этим учебным курсом требуются программное обеспечение и ресурсы, перечисленные ниже.*
|===
|Программное обеспечение или материал |Требуемая версия
|link:http://netbeans.org/downloads/[+IDE NetBeans+] |Версия 7.4 или 8.0
|link:http://www.oracle.com/technetwork/java/javase/downloads/index.html[+Комплект для разработчика на языке Java (JDK)+] |Версия 6, 7 или 8
|===
== Введение
Для многих начинающих программистов на Java проблемой является обработка изображений в приложении. Обычный способ доступа к изображениям в приложении на Java состоит в применении метода `link:http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)[+getResource()+]`. В данном учебном курсе описывается использование конструктора графических интерфейсов среды IDE для создания кода с добавлением изображений других ресурсов) в приложение. Кроме того, пользователь научится настраивать способы создания средой IDE кода для обработки изображений.
Созданное в результате изучения этого учебного курса приложение будет представлять собой простую форму, содержащую одну надпись с одним изображением.
== Создание приложения
1. Выберите команду "Файл" > "Новый проект".
2. В мастере создания проекта выберите "Java" > "Приложение Java", затем нажмите кнопку "Дальше".
3. В качестве имени проекта введите `ImageDisplayApp`.
4. Снимите флажок "Создать главный класс".
[.feature]
--
image::images/newproj-small.png[role="left", link="images/newproj.png"]
--
. Нажмите кнопку 'Готово'.
== Создание формы приложения
В примере в этом разделе будет создана форма JFrame, и в нее добавлена метка JLabel.
*Создание формы JFrame:*
1. В окне 'Проекты' разверните узел ``ImageDisplayApp`` .
2. Щелкните правой кнопкой узел "Исходные файлы" и выберите форму "Создать" > "JFrame".
3. В качестве имени класса введите `ImageDisplay`.
4. В качестве имени пакета введите `org.me.myimageapp`.
5. Нажмите кнопку 'Готово'.
*Добавление надписи:*
* В разделе "Палитра" выберите компонент "Метка" и перетащите его в форму.
Форма должна принять следующий вид:
[.feature]
--
image::images/form-small.png[role="left", link="images/form.png"]
--
== Добавление пакета для изображения
Если в приложении используются изображения или другие ресурсы, то для этих ресурсов обычно следует выбрать отдельный пакет Java. В локальной файловой системе пакет соответствует папке.
*Создание пакета для изображения:*
1. В окне 'Проекты' щелкните правой кнопкой мыши узел `org.me.myimageapp` и выберите 'Создать' > 'Пакет Java'.
[.feature]
--
image::images/package-small.png[role="left", link="images/package.png"]
--
. Нажмите кнопку 'Готово'.
В окне 'Проекты' в папке `Исходные пакеты` отображается новый пакет.
image::images/project-with-imagepack.png[]
== Вывод изображения в качестве метки
В этом приложении изображение будет встроено в компонент JLabel.
*Добавление изображения к метке:*
1. В редакторе GUI Designer выберите метку, добавленную ранее в форму.
2. В окне "Свойства" щелкните категорию "Свойства" и выполните прокрутку до свойства "Значок".
3. Нажмите кнопку со многоточием (...).
Отображается редактор свойств значка.
[.feature]
--
image::images/importimage-small.png[role="left", link="images/importimage.png"]
--
. В диалоговом окне свойств значка щелкните Import to Project ("Импорт в проект").
. В окне выбора файлов выберите любое сохраненное в компьютере изображение. Затем нажмите кнопку "Дальше".
. На странице 'Выбор целевой папки' выберите папку `newpackage` и нажмите 'Готово'.
[.feature]
--
image::images/targetfolder-small.png[role="left", link="images/targetfolder.png"]
--
. Нажмите ОК, чтобы закрыть диалоговое окно свойств значка.
При нажатии на кнопку OK IDE выполняет следующие действия:
* Копирование изображения в проект. В результате при выполнении сборки и распространения приложения это изображение добавляется в распространяемый архив JAR.
* Создание кода, реализующего доступ к изображению, в классе "ImageDisplay".
* Отображение изображения в качестве метки в режиме разработки формы.
[.feature]
--
image::images/label-added-small.png[role="left", link="images/label-added.png"]
--
Теперь можно выполнить несколько действий по оптимизации вида формы, например:
* В окне "Свойства" выберите свойство `text` и удалите метку `jLabel1`. Это значение было создано конструктором графического интерфейса в качестве отображаемого текста метки. В данном же случае в качестве метки отображается изображение, а не текст, поэтому вводить текст не требуется.
* Перетащите `jLabel1` в центральную область формы.
[.feature]
--
image::images/centered-small.png[role="left", link="images/centered.png"]
--
*Просмотр созданного кода:*
1. В средстве проектирования GUI нажмите кнопку 'Исходный код'. (Если кнопка 'Исходный код' скрыта, выберите Вид > Панель редактора исходного кода в главном меню.)
2. Прокрутите вниз до строки "Созданный код".
3. Щелкните значок (+) слева от строки "Созданный код" для просмотра кода, созданного GUI Designer.
Основная строка выглядит следующим образом:
[source,java]
----
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/me/myimageapp/newpackage/image.png"))); // NOI18N
----
Свойство `Icon` элемента `jLabel1` было изменено в редакторе свойств, поэтому средой IDE был создан метод `setIcon`. В параметре этого метода содержится вызов метода `link:http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)[+getResource()+]` анонимного внутреннего класса в `ImageIcon`. Обратите внимание на то, что созданный путь к изображению связан с его местоположением в структуре пакетов приложения.
*Примечания*
* Если в редакторе свойств значка установить параметр "Внешнее изображение", то средой IDE будет создан абсолютный путь к изображению, т.е. само изображение не будет скопировано в проект. Как следствие, при запуске приложения на этом же компьютере изображение появится, а при запуске на другом компьютере -- скорее всего, нет.
* Метод `getResource` также используется для доступа к другим ресурсам, таким как текстовые файлы с какими-либо данными, используемыми в приложении.
*Чтобы зарегистрировать обработчики для событий мыши на Jlabel:*
В режиме конструирования щелкните правой кнопкой мыши объект JLabel и выберите События > Мышь > mouseClicked/mousePressed/mouseReleased в контекстном меню.
Для выбранного события создается обработчик событий.
*Примечание.* Можно получить координаты мыши (например, местоположение щелчка мыши) в обработчике событий с помощью методов `event.getPoint()`, `event.getX()` и `event.getY()`. Подробности приведены в разделе link:http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/event/MouseEvent.html[+Класс MouseEvent+].
== Показ изображения как фона в кадре
Конструктор графического интерфейса не поддерживает напрямую использование JFrame как фонового изображения, поскольку такой поддержки нет в Swing.
Тем не менее, этой цели можно достигнуть различными непрямыми путями. В этом приложении JLabel с изображением будет внедрен в компонент JFrame, тогда как JPanel будет размещен над JLabel и использован как родительский элемент для всех компонентов.
*Добавление прозрачного компонента JPanel к JFrame внутри изображения:*
1. Выберите команду "Файл" > "Новый проект".
2. В мастере создания проекта выберите "Java" > "Приложение Java", затем нажмите кнопку "Дальше".
3. В качестве имени проекта введите `BackgroundImageApp`.
4. Снимите флажок "Создать главный класс".
[.feature]
--
image::images/prj-small.png[role="left", link="images/prj.png"]
--
. Нажмите кнопку 'Готово'.
. В окне 'Проекты' разверните узел `BackgroundImageApp`.
. Щелкните правой кнопкой узел "Исходные файлы" и выберите форму "Создать" > "JFrame".
. В качестве имени класса введите `ImageDisplay`.
. В качестве имени пакета введите `org.me.mybackgroundapp`.
[.feature]
--
image::images/newjframe-small.png[role="left", link="images/newjframe.png"]
--
. Нажмите кнопку 'Готово'.
. В режиме конструирования щелкните правой кнопкой мыши объект JFrame и выберите 'Выбрать макет > Макет контейнера сетки' в контекстном меню.
. Щелкните правой кнопкой мыши объект JFrame и выберите Добавить из палитры > Контейнеры Swing > Панель в контекстном меню.
. В окне свойств отмените выбор свойства jPanel `opaque`.
. Щелкните правой кнопкой мыши объект JFrame и выберите Добавить из палитры > Элементы управления Swing > Метка в контекстном меню.
. В окне 'Проекты' щелкните правой кнопкой мыши узел `org.me.mybackgroundapp` и выберите 'Создать' > 'Пакет Java'.
. Нажмите кнопку "Готово". В результате будет добавлен новый пакет.
. В редакторе GUI Designer выберите метку, добавленную ранее в форму.
. В окне "Свойства" щелкните категорию "Свойства" и выполните прокрутку до свойства "Значок".
. Нажмите кнопку со многоточием (...).
. В диалоговом окне свойств значка щелкните Import to Project ("Импорт в проект").
. В окне выбора файлов выберите любое сохраненное в компьютере изображение. Затем нажмите кнопку "Дальше".
. На странице 'Выбор целевой папки' в мастере выберите каталог ресурсов `newpackage` и нажмите 'Готово'.
[.feature]
--
image::images/targetfolder-small.png[role="left", link="images/targetfolder.png"]
--
. Нажмите ОК, чтобы закрыть диалоговое окно свойств значка.
. В навигаторе щелкните правой кнопкой мыши jPanel и выберите 'Свойства' во всплывающем меню.
. В диалоговом окне Properties ("Свойства") установите свойства `Grid X`, `Grid Y`, `Weight X` и `Weight Y` на `1`, а свойство `Fill` на `Both`.
[.feature]
--
image::images/panelprops-small.png[role="left", link="images/panelprops.png"]
--
. Выберите "Close" (Закрыть).
. Повторите шаги 24 и 25 для jLabel.
. В диалоговом окне 'Свойства' выберите свойство `text` и удалите `jLabel1`.
[.feature]
--
image::images/labelprops-small.png[role="left", link="images/labelprops.png"]
--
Фон готов. Теперь можно, например, перетащить jLabel и jTextField в jPanel из Palette. Оба они будут отображены поверх фонового изображения.
image::images/background.png[]
*Примечание.* Преимуществом описанного решения является то, что фоновое изображение показывается как в ходе разработки, так и во время выполнения.
== Сборка и запуск приложения
На данном этапе после создания кода, реализующего доступ к изображению и вывод его на экран, можно выполнить сборку и запуск приложения и проверить правильность вызова изображения.
Сначала необходимо указать главный класс проекта. При назначении главного класса среда IDE получает информацию о том, какой класс следует запускать при запуске проекта. Кроме того, таким образом обеспечивается создание элемента `Main-Class` в архиве JAR приложения при его сборке.
*Для назначения главного класса проекта выполните следующие действия:*
1. Правой кнопкой щелкните узел "ImageDisplayApp" проекта и выберите "Свойства".
2. В диалоговом окне "Свойства проекта" выберите категорию "Выполнение".
3. Нажмите кнопку "Обзор" рядом с полем "Главный класс". Затем выберите класс `org.me.myimageapp.ImageDisplay`.
[.feature]
--
image::images/mainclass-small.png[role="left", link="images/mainclass.png"]
--
. Нажмите кнопку 'Выбрать основной класс'.
. Нажмите кнопку "ОК" для закрытия диалогового окна "Свойства проекта".
*Для сборки проекта:*
* Выберите Запуск > Очистить и собрать проект (_project_name_) на главной панели инструментов.
В окне "Файлы" отображаются объекты, созданные при сборке приложения. Скомпилированный класс находится в папке `build`. В папке `dist` находится исполняемый архив JAR, содержащий скомпилированный класс и изображение.
image::images/files.png[]
*Для запуска проекта выполните следующие действия:*
* Выберите Запуск > Запуск проекта (_project_name_) на главной панели инструментов.
== Создание пользовательского кода
Во многих приложениях выводимое изображение определяется не статически, как в данном примере. К примеру, выводимое изображение может определяться тем, что выбрал пользователь.
Если требуется предоставить возможность выбора изображения в исходном коде, то можно написать пользовательский код для вызова и отображения необходимых ресурсов. В среде IDE не предусмотрена возможность добавления кода в "защищенные блоки", содержащие созданный GUI Builder код, в режиме просмотра исходного кода. Однако существует возможность вставки кода в защищенные блоки с помощью редакторов свойств, которые можно вызвать в окне "Свойства". Если использовать в этих целях редакторы свойств, то пользовательский код не будет потерян при внесении изменений в GUI Builder.
*Например, для вставки пользовательского кода в свойство `icon` метки JLabel выполните следующие действия:*
1. Выберите JLabel в представлении 'Конструирование' или в окне 'Навигатор'.
2. В окне 'Свойства' нажмите кнопку (...) рядом со свойством `icon`.
3. В раскрывающемся списке в верхней области диалогового окна выберите параметр "Пользовательский код".
[.feature]
--
image:images/custom-code-small.png[role="left", link="images/custom-code.png"]
--
С помощью параметра "Пользовательский код" в этом редакторе свойств можно вручную указать метод `setIcon`. Кроме того, в этом параметре можно ввести требуемую логику или указать вызов отдельного метода, для которого вручную был создан код.
[.feature]
--
image::images/custom-view-small.png[role="left", link="images/custom-view.png"]
--
== Заключение
В этом руководстве описывается получение доступа к изображениям из приложения, созданного в IDE NetBeans. Более подробно работа с изображениями рассматривается в учебном курсе по Java.
*Примечание. *Пример в этом учебном курсе очень схож с первым примером в разделе учебного курса по Java link:http://java.sun.com/docs/books/tutorial/uiswing/components/icon.html[+Использование раздела значков+]. Отличие заключается в том, что в коде, создаваемом при работе по этому учебному курсу, для вставки изображения в надпись используется метод `link:http://download.oracle.com/javase/6/docs/api/javax/swing/JLabel.html#setIcon(javax.swing.Icon)[+setIcon+]` элемента `link:http://download.oracle.com/javase/6/docs/api/javax/swing/JLabel.html[+JLabel+]`. В примере, приведенном в учебном курсе по Java, в значок добавляется в метку путем его передачи через конструктор.
link:/about/contact_form.html?to=3&subject=Feedback:%20Handling%20Images%20in%20a%20GUI%20Application[+Отправить отзыв по этому учебному курсу+]
== Дополнительные сведения
* link:gui-functionality.html[+Введение в разработку графического интерфейса +]
* link:quickstart-gui.html[+Разработка Swing GUI в IDE NetBeans+]
* link:../../trails/matisse.html[+Учебная карта по приложениям с графическим интерфейсом Java +]
* link:../../trails/java-se.html[+Учебная карта по общим сведениям о разработке на Java+]
* link:http://wiki.netbeans.org/NetBeansUserFAQ#GUI_Editor_.28Matisse.29[+GUI Builder – часто задаваемые вопросы+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG920[+Реализация Java GUI+] в документе _Разработка приложений в IDE NetBeans_