blob: d6279c05c595e776bb13c894c43aaba7b5ee6d40 [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<!--Copyright (c) 2009, 2014, Oracle and/or its affiliates. All rights reserved.
-->
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="description" content="Tutorial that shows how to handle images and
other resources when creating Swing applications in NetBeans IDE">
<meta name="keywords" content="NetBeans, IDE, integrated development environment tutorial, guide, user, documentation, open source">
<link rel="stylesheet" type="text/css" href="../../../netbeans.css">
<title>Handling Images in a Java GUI Application - NetBeans IDE tutorial</title>
</head>
<body>
<h1>Handling Images in a Java GUI Application</h1>
<p><b>Contents</b></p>
<img src="../../../images_www/articles/74/netbeans-stamp-80-74.png" class="stamp" alt="Content on this page applies to NetBeans IDE 7.4 and 8.0" title="Content on this page applies to the NetBeans IDE 7.4 and 8.0">
<ul class="toc">
<li><a href="#intro">Introduction</a></li>
<li><a href="#form">Creating the Application Form</a></li>
<li><a href="#package">Adding a Package for the Image</a></li>
<li><a href="#displaying">Displaying the Image on the Label</a></li>
<li><a href="#building">Building and Running the Application</a></li>
<!--<li><a href="#background">Displaying the Image as the Background on the Frame</a></li><-->
<li><a href="#custom">Creating Custom Code</a></li>
<li><a href="#summary">Summary</a></li>
<li><a href="#seealso">See Also</a></li>
</ul>
<p>
<b>To complete this tutorial, you need the following software and resources.</b>
</p>
<table>
<tbody>
<tr>
<th class="tblheader" scope="col">Software or Resource</th>
<th class="tblheader" scope="col">Version Required</th>
</tr>
<tr>
<td class="tbltd1"><a href="http://netbeans.org/downloads/">NetBeans IDE</a></td>
<td class="tbltd1">Version 7.4 or 8.0 </td>
</tr>
<tr>
<td class="tbltd1"><a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html">Java Development Kit (JDK)</a></td>
<td class="tbltd1">Version 6, 7 or 8 </td>
</tr>
</tbody>
</table>
<a name="intro"></a><h2>Introduction</h2>
<p>Handling images in an application is a common problem for many beginning Java
programmers. The standard way to access images in a Java application is
by using the <code><a href="http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)" target="_blank">getResource()</a></code> method.
This tutorial shows you how to
use the IDE's GUI Builder to generate the code to include images (and other resources)
in your application. In addition, you will learn how
to customize the way the IDE generates image handling code.</p>
<p>The application that results from this tutorial will be a simple JFrame that
contains one JLabel that displays a single image.</p>
<h2>Creating the Application</h2>
<ol>
<li>Choose File &gt; New Project.</li>
<li>In the New Project wizard, select Java &gt; Java Application and click Next.</li>
<li>For Project Name, type <code>ImageDisplayApp</code>.</li>
<li>Clear the Create Main Class checkbox.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/newproj.png" rel="lytebox" title="New Project wizard - Click to Enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/newproj-small.png" alt="New Project wizard" border=1></a></p></li>
<li>Click Finish.</li>
</ol>
<a name="form"></a><h2>Creating the Application Form</h2>
<p>In this section, you create the JFrame form and add a JLabel to the form.</p>
<p><b>To create the JFrame form:</b></p>
<ol>
<li>In the Projects window, expand the <tt>ImageDisplayApp</tt> node.</li>
<li>Right-click the Source Packages node and choose New &gt; JFrame Form.</li>
<li>For Class Name, type <code>ImageDisplay</code>.</li>
<li>For Package Name, type <code>org.me.myimageapp</code>.</li>
<li>Click Finish.</li>
</ol>
<p><b>To add the JLabel:</b></p>
<ul>
<li>In the Palette, select the Label component and drag it to the JFrame.</li>
</ul>
<p>For now, the form should look something like the following image:</p>
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/form.png" rel="lytebox" title="Generated form with the label added - Click to Enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/form-small.png" alt="Generated form with the label added" border=1></a></p>
<a name="package"></a><h2>Adding a Package for the Image</h2>
<p>When you use images or other resources in an application, typically you
create a separate Java package for the resources. On your local filesystem,
a package corresponds with a folder.</p>
<p><b>To create a package for the image:</b></p>
<ol>
<li>In the Projects window, right-click the <code>org.me.myimageapp</code>
node and choose New &gt; Java Package.<br>
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/package.png" rel="lytebox" title="Adding a new Java package - Click to Enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/package-small.png" alt="Adding a new Java package" border=1></a></p></li>
<li>Click Finish.</li>
</ol>
<p>In the Projects window, you should see a new package appear within the <code>Source Packages</code> folder.</p>
<p class="align-center"><img src="../../../images_www/articles/72/java/gui-image-display/project-with-imagepack.png"
alt="Projects window" border=1></p>
<a name="displaying"></a><h2>Displaying the Image on the Label</h2>
<p>In this application, the image will be embedded within a JLabel component.</p>
<p><b>To add the image to the label:</b></p>
<ol>
<li>In the GUI Designer, select the label that you have added to your form.</li>
<li>In the Properties window, click the Properties category and
scroll to the Icon property.</li>
<li>Click the ellipsis (...) button.<br>
The icon property editor is displayed.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/importimage.png" rel="lytebox" title="Icon Property Editor - Click to Enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/importimage-small.png" alt="Icon Property Editor" border=1></a></p></li>
<li>In the icon property dialog box, click Import to Project.</li>
<li>In the file chooser navigate to any image that is on your system that you want to use.
Then click Next.</li>
<li>In the Select target folder page of the wizard, select the <code>newpackage</code> folder and click Finish.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/targetfolder.png" rel="lytebox" title="Select Target Folder page of the Import Images to Project wizard">
<img src="../../../images_www/articles/72/java/gui-image-display/targetfolder-small.png" alt="Select Target Folder page of the Import Images to Project wizard" border=1></a></p>
</li>
<li>Click OK to close the icon property dialog box.</li>
</ol>
<p>After you click OK, the IDE does the following things:</p>
<ul>
<li>Copies the image to your project. Therefore, when you build and distribute the application,
the image is included in the distributable JAR file.</li>
<li>Generates code in the ImageDisplay class to access the image.</li>
<li>Displays your image on the label in the Design view of your form.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/label-added.png" rel="lytebox" title="Image added to the label">
<img src="../../../images_www/articles/72/java/gui-image-display/label-added-small.png" alt="Image added to the label" border=1></a></p></li>
</ul>
<p>At this point, you can do some simple things to improve the appearance of the
form, such as:</p>
<ul>
<li>In the Properties window, select the <code>text</code> property and delete
<code>jLabel1</code>. That value was generated by the GUI Builder as
display text for the label. However, you are
using the label to display an image rather than text, so that
text is not needed.</li>
<li>Drag the <code>jLabel1</code> to the center of the form.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/centered.png" rel="lytebox" title="The Design view of the ImageDisplay class with the image centered">
<img src="../../../images_www/articles/72/java/gui-image-display/centered-small.png" alt="The Design view of the ImageDisplay class with the image centered" border=1></a></p></li>
</ul>
<p><b>To view the generated code:</b></p>
<ol>
<li>In the GUI Designer, click the Source button. (Choose View &gt; Source Editor Toolbar from the main menu if the Source button is hidden.)</li>
<li>Scroll down to the line that says Generated Code.</li>
<li>Click the plus sign (+) to the left of the Generated Code line to display
the code that the GUI Designer has generated.</li>
</ol>
<p>The key line is the following:</p>
<pre class="examplecode">jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource(&quot;/org/me/myimageapp/newpackage/image.png&quot;))); // NOI18N</pre>
<p>Since you have used the property editor for <code>jLabel1</code>'s <code>Icon</code> property,
the IDE has generated the <code>setIcon</code> method. The parameter of that method
contains a call to the <code><a href="http://download.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String)" target="_blank">getResource()</a></code>
method on an anonymous inner class of <code>ImageIcon</code>.
Notice that the generated path for the image corresponds with its location in
the application's package structure.</p>
<p class="notes"><b>Notes:</b></p>
<ul>
<li>If you use the External Image option in the
icon property editor, the IDE will
generate an absolute path to the image instead of copying the image to your project.
Therefore, the image would appear when you run the application on your system, but
it would probably not appear when running the application on another system.</li>
<li>The <code>getResource</code> method is also useful
for accessing other types of resources, such as text files that
contain data that your application might need to use.</li>
</ul>
<p><b>To register event handlers for mouse events on the Jlabel:</b></p>
<p>
In the Design View, right-click the JLabel and choose Events &gt; Mouse &gt; mouseClicked/mousePressed/mouseReleased from the popup menu.<br>
An event handler is generated for the corresponding event.</p>
<p class="notes"><b>Note:</b> You can get the mouse coordinates (for example, the location of a mouse
click) in the event handler using the <code>event.getPoint()</code>, <code>event.getX()</code>, or <code>event.getY()</code> methods. See <a href="http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/event/MouseEvent.html">Class MouseEvent</a> for details.</p>
<!--<a name="background"></a>
<h2>Displaying the Image as the Background on the Frame</h2>
<p> There is no direct support for a background image of JFrame in the GUI Builder, since there is no direct support for a background image of JFrame in Swing.<br> Anyway, there are various indirect ways to achieve such a goal. In this application, the JLabel with the image will be embedded within a JFrame component, while a
transparent JPanel will be placed over the JLabel and used as the parent of all the components.</p>
<p><b>To add a transparent JPanel to the JFrame with the image:</b></p>
<ol>
<li>Choose File &gt; New Project.</li>
<li>In the New Project wizard, select Java &gt; Java Application and click Next.</li>
<li>For Project Name, type <code>BackgroundImageApp</code>.</li>
<li>Clear the Create Main Class checkbox.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/prj.png" rel="lytebox" title="Creating a new project - Click to enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/prj-small.png" alt="Creating a new project" border=1></a></p></li>
<li>Click Finish.</li>
<li>In the Projects window, expand the <code>BackgroundImageApp</code> node.</li>
<li>Right-click the Source Packages node and choose New &gt; JFrame Form.</li>
<li>For Class Name, type <code>ImageDisplay</code>.</li>
<li>For Package Name, type <code>org.me.mybackgroundapp</code>.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/newjframe.png" rel="lytebox" title="Adding a new form - Click to enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/newjframe-small.png" alt="Adding a new form" border=1></a></p></li>
<li>Click Finish.</li>
<li>In the Design view, right-click the JFrame and choose Set Layout &gt; Grid Bag Layout from the popup menu. </li>
<li>Right-click the JFrame and choose Add From Palette &gt; Swing Containers &gt; Panel from the popup menu. </li>
<li>In the Properties window, deselect the jPanel's <code>opaque</code> property.</li>
<li>Right-click the JFrame and choose Add From Palette &gt; Swing Controls &gt; Label from the popup menu.</li>
<li>In the Projects window, right-click the <code>org.me.mybackgroundapp</code>
node and choose New &gt; Java Package.</li>
<li>Click Finish. A new package is added.
</li>
<li>In the GUI Designer, select the label that you have added to your form.</li>
<li>In the Properties window, click the Properties category and scroll to the Icon property.</li>
<li>Click the ellipsis (...) button. </li>
<li>In the icon property dialog box, click Import to Project.</li>
<li>In the file chooser navigate to any image that is on your system that you want to use. Then click Next.</li>
<li>In the Select Target Folder page of the wizard, select the <code>newpackage</code> resources folder and click Finish.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/targetfolder.png" rel="lytebox" title="Select Target Folder page of the Import Images to Project wizard - Click to enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/targetfolder-small.png" alt="Select Target Folder page of the Import Images to Project wizard" border=1></a></p></li>
<li>Click OK to close the icon property dialog box.</li>
<li>In the Navigator, right-click the jPanel and choose Properties from the popup menu. </li>
<li>In the Properties dialog box set the <code>Grid X</code>, <code>Grid Y</code>, <code>Weight X</code>, and <code>Weight Y</code> properties to <code>1</code> and the <code>Fill</code> property to <code>Both</code>.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/panelprops.png" rel="lytebox" title="Panel properties - Click to enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/panelprops-small.png" alt="Panel properties" border=1></a></p></li>
<li>Click Close. </li>
<li>Repeat steps 24 and 25 for the jLabel.</li>
<li>In the Properties dialog box select the <code>text</code> property and delete <code>jLabel1</code>.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/labelprops.png" rel="lytebox" title="Label properties - Click to enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/labelprops-small.png" alt="Label properties" border=1></a></p>
The background is done. Now you can drag, a jLabel and a jTextField to the jPanel from the Palette, for example. Both of them will display over the background image.
<p class="align-center"><img src="../../../images_www/articles/72/java/gui-image-display/background.png"
alt="Screenshot showing the Design view of the Background class." class="margin-around"></p></li>
</ol>
<p class="notes"><b>Note:</b> The advantage of the described solution is that the background image is shown at both design-time and runtime.</p>-->
<a name="building"></a><h2>Building and Running the Application</h2>
<p>Now that you have generated the code for accessing and
displaying the image, you can build and run the application to ensure that the
image is accessed.</p>
<p>First you need to set the project's main class. When you set the main
class, the IDE knows which class to run when you run the project.
In addition, this ensures that the <code>Main-Class</code> element in the application's
JAR file is generated when you build the application.</p>
<p><b>To set the project's main class:</b></p>
<ol>
<li>Right-click the ImageDisplayApp project's node and
choose Properties.</li>
<li>In the Project Properties dialog box, select the Run
category.</li>
<li>Click the Browse button that is next to the Main Class
field. Then select the <code>org.me.myimageapp.ImageDisplay</code>
class.
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/mainclass.png" rel="lytebox" title="Selecting the main class - Click to enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/mainclass-small.png" alt="Selecting the main class" border=1></a></p></li>
<li>Click the Select Main Class button.</li>
<li>Click OK to close the Project Properties dialog box. </li>
</ol>
<p><b>To build the project:</b></p>
<ul>
<li>Choose Run &gt; Clean &amp; Build Project (<i>project_name</i>) from the main toolbar.</li>
</ul>
<p>You can view the build products of the application in the Files
window. The <code>build</code> folder contains the compiled class.
The <code>dist</code> folder contains a
runnable JAR file that contains the compiled class and the image.</p>
<p class="align-center"><img src="../../../images_www/articles/72/java/gui-image-display/files.png"
alt="The Files window with the build and dist folders expanded" border=1></p>
<p><b>To run the project:</b></p>
<ul>
<li>Choose Run &gt; Run Project (<i>project_name</i>) from the main toolbar.</li>
</ul>
<a name="custom"></a><h2>Creating Custom Code</h2>
<p>In many applications, the image that is displayed is not determined
statically like it is in this example. For example, the image to display
might be determined by something that the user clicks. </p>
<p>If you need to be
able to choose
the image to display programmatically, you can write your own custom code
to access and display resources. The IDE prevents you from writing code
directly in the Source view's &quot;guarded blocks&quot; that contain code generated by
the GUI Builder. However, you can insert code in the guarded blocks through
property editors that you can access through
the Properties window. Using the property editors in this manner ensures that
your custom code is not lost when you make design changes in the GUI Builder.</p>
<p><b>For example, to write custom code for a JLabel's <code>icon</code> property:</b></p>
<ol>
<li>Select the JLabel in the Design View or in the Navigator window.</li>
<li>In the Properties window, click the ellipsis (...) button that is
next to the <code>icon</code> property.</li>
<li>From the dropdown list at the top of the dialog box, select
the Custom Code option.</li>
</ol>
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/custom-code.png" rel="lytebox" title="The Icon property editor with the Custom Code option selected - Click to enlarge"><img src="../../../images_www/articles/72/java/gui-image-display/custom-code-small.png" alt="The Icon property editor with the Custom Code option selected" border=1></a></p>
<p>The Custom Code option in this property editor lets you fill in the
parameter of the <code>setIcon</code>
method yourself. You can fill in this parameter with the necessary logic
or with a call to a separate method that you have hand-coded elsewhere
in the class.</p>
<p class="align-center"><a href="../../../images_www/articles/72/java/gui-image-display/custom-view.png" rel="lytebox" title="Text area where you can enter the setIcon paramater - Click to enlarge">
<img src="../../../images_www/articles/72/java/gui-image-display/custom-view-small.png" alt="Text area where you can enter the setIcon paramater" border=1></a></p>
<a name="summary"></a><h2>Summary</h2>
<p>This tutorial has shown you how to access images from an application
that you create in the NetBeans IDE. Image handling is further discussed in the
Java Tutorial. </p>
<p class="notes"><b>Note: </b>The example given in this tutorial is very similar to the first
example in the
<a href="http://java.sun.com/docs/books/tutorial/uiswing/components/icon.html" target="_blank">How to Use Icons section</a>
of the Java Tutorial. One difference is that the code that is generated when you follow
this tutorial uses
<code><a href="http://download.oracle.com/javase/6/docs/api/javax/swing/JLabel.html" target="_blank">JLabel</a></code>'s
<code><a href="http://download.oracle.com/javase/6/docs/api/javax/swing/JLabel.html#setIcon(javax.swing.Icon)" target="_blank">setIcon</a></code>
method to apply the
icon to the label. In the Java Tutorial example, the icon is applied to the label
by being passed through its constructor.</p>
<div class="feedback-box">
<a href="/about/contact_form.html?to=3&amp;subject=Feedback:%20Handling%20Images%20in%20a%20GUI%20Application">Send Feedback on This Tutorial</a>
</div>
<br style="clear:both;" >
<a name="seealso"></a><h2>See Also</h2>
<ul>
<li><a href="gui-functionality.html">Introduction to GUI Building</a></li>
<li><a href="quickstart-gui.html">Designing a Swing GUI in NetBeans IDE</a></li>
<li><a href="../../trails/matisse.html">Java GUI Applications Learning Trail</a></li>
<li><a href="../../trails/java-se.html">General Java Development Learning Trail</a></li>
<li><a href="http://wiki.netbeans.org/NetBeansUserFAQ#GUI_Editor_.28Matisse.29" target="_blank">GUI Builder - Frequently Asked Questions</a></li>
<li><a href="http://www.oracle.com/pls/topic/lookup?ctx=nb8000&amp;id=NBDAG920">Implementing Java GUIs</a> in <i>Developing Applications with NetBeans IDE</i></li>
</ul>
</body>
</html>