在 Java GUI 应用程序中处理图像
目录
要学完本教程,您需要具备以下软件和资源。
简介
在应用程序中处理图像是很多 Java 编程初学者遇到的一个常见问题。要访问 Java 应用程序中的图像,标准作法是使用 getResource() 方法。本教程介绍了如何使用 IDE 的 GUI 生成器生成代码,以便在应用程序中包含图像(和其他资源)。此外,您还将了解如何定制 IDE 生成图像处理代码的方式。
本教程生成的应用程序是一个简单的 JFrame,其中包含一个显示单个图像的 JLabel。
创建应用程序
- 选择 "File"(文件)> "New Project"(新建项目)。
- 在 "New Project"(新建项目)向导中,选择 "Java" > "Java Application"(Java 应用程序),然后单击 "Next"(下一步)。
- 键入
ImageDisplayApp 作为项目名称。
- 清除 "Create Main Class"(创建主类)复选框。
- 确保 "Set As Main Project"(设置为主项目)复选框处于选中状态。

- 单击 "Finish"(完成)。
创建应用程序窗体
在本节中,将创建 JFrame 窗体并在窗体中添加 JLabel。
要创建 JFrame 窗体,请执行以下操作:
- 在 "Projects"(项目)窗口中,展开 "ImageDisplayApp" 节点。
- 右键单击 "Source Packages"(源包)节点,然后选择 "New"(新建)> "JFrame Form"(JFrame 窗体)。
- 键入
ImageDisplay 作为类名。
- 键入
org.me.myimageapp 作为包名。
- 单击 "Finish"(完成)。
要添加 JLabel,请执行以下操作:
- 在组件面板中,选择 "Lable"(标签)组件并将其拖至 JFrame 上。
此时,该窗体类似于下图:

为图像添加包
在应用程序中使用图像或其他资源时,通常应为资源创建单独的 Java 包。在本地文件系统上,包对应于一个文件夹。
要为图像创建包,请执行以下操作:
- 在 "Projects"(项目)窗口中,右键单击
org.me.myimageapp 节点,然后选择 "New"“(新建)> "Java Package"(Java 包)。

- 在新建包向导中,将
.resources 添加到 org.me.myimageapp 中,使新包名称为 org.me.myimageapp.resources。
- 单击 "Finish"(完成)。
在 "Projects"(项目)窗口中,将会看到图像显示在 org.me.myimageapp.resources 包中。

在标签上显示图像
在此应用程序中,图像将嵌入到 JLabel 组件中。
要将图像添加到标签上,请执行以下操作:
- 在 GUI 设计器中,选择已添加到窗体上的标签。
- 在 "Properties"(属性)窗口中,单击 "Properties"(属性)类别,然后滚动到 icon 属性。
- 单击省略号 (...) 按钮。
- 在 icon 属性对话框中,单击 "Import to Project"(导入到项目)。

- 在文件选择器中,导航到系统上要使用的任何图像。然后,单击 "Next"(下一步)。
- 在向导的 "Select Target Folder"(选择目标文件夹)页中,选择
resources 文件夹,然后单击 "Finish"(完成)。

在单击 "Finish"(完成)时,IDE 将执行以下任务:
- 将图像复制到项目中。因此,在生成和分发应用程序时,图像将包含在可分发的 JAR 文件中。
- 在 ImageDisplay 类中生成代码以访问图像。
- 在窗体的 "Design"(设计)视图中显示标签上的图像。
此时,可以执行一些简单操作以改进窗体外观,例如:
- 在 "Properties"(属性)窗口中,选择
text 属性,然后删除 jLabel1。该值是由 GUI 生成器生成的,以作为标签的显示文本。不过,将使用标签显示图像而不是文本,因此不需要使用该文本。
- 拖动按钮以将其放在窗体中心。
要查看生成的代码,请执行以下操作:
- 在 GUI 设计器中,单击 "Source"(源)标签。
- 向下滚动到显示 "Generated Code" 的行。
- 单击 "Generated Code" 行左侧的加号 (+),以显示 GUI 设计器生成的代码。
关键的一行如下所示:
jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/me/myimageapp/resources/park-sculpture.jpg"))); // NOI18N
由于使用了 jLabel1 的 icon 属性的属性编辑器,因此,IDE 生成 setIcon 方法。该方法的参数包含针对 ImageIcon 匿名内部类的 getResource() 方法调用。请注意,为图像生成的路径与它在应用程序的包结构中的位置相对应。
注意:
- 如果在 icon 属性编辑器中使用 " External Image"(外部图像)选项,IDE 将生成图像的绝对路径,而无需将图像复制到项目中。因此,在您的系统上运行应用程序时,将显示该图像;而在其他系统上运行应用程序时,可能不会显示该图像。
- 还可以使用
getResource 方法访问其他类型的资源,例如,包含应用程序可能需要使用的数据的文本文件。
在 Jlabel 上注册鼠标事件的事件处理程序:
右键单击 "JLabel",然后从弹出式菜单中选择 "Events"(事件)> "Mouse"(鼠标)> "mouseClicked/mousePressed/mouseReleased"。
此时将为相应事件生成事件处理程序。
注意:在事件处理程序中,可以使用 event.getPoint()、event.getX() 或 event.getY() 方法获得鼠标坐标(例如鼠标单击的位置)。有关详细信息,请参见 MouseEvent 类。
将图像显示为框架上的背景
GUI 生成器不直接支持 JFrame 的背景图像,因为 Swing 不直接支持 JFrame 的背景图像。
不过,可以通过各种间接的方法实现这一目标。在该应用程序中,包含图像的 JLabel 将嵌入 JFrame 组件中,而透明的 JPanel 将放置在 JLabel 之上,用作所有组件的父项。
将透明的 JPanel 添加到包含图像的 JFrame 中:
- 选择 "File"(文件)> "New Project"(新建项目)。
- 在 "New Project"(新建项目)向导中,选择 "Java" > "Java Application"(Java 应用程序),然后单击 "Next"(下一步)。
- 键入
BackgroundImageApp 作为项目名称。
- 清除 "Create Main Class"(创建主类)复选框。
- 确保 "Set As Main Project"(设置为主项目)复选框处于选中状态。
- 在 "Projects"(项目)窗口中,展开
BackgroundImageApp 节点。
- 右键单击 "Source Packages"(源包)节点,然后选择 "New"(新建)> "JFrame Form"(JFrame 窗体)。
- 键入
ImageDisplay 作为类名。
- 键入
org.me.mybackgroundapp 作为包名。
- 单击 "Finish"(完成)。
- 在 "Design"(设计)视图中,右键单击 "JFrame",然后从弹出式菜单中选择 "Set Layout"(设置布局)> "GridBag layout"(GridBag 布局)。
- 右键单击 "JFrame",然后从弹出式菜单中选择 "Add From Pallette"(从组件面板上添加)> "Swing Containers"(Swing 容器)> "Panel"(面板)。
- 在 "Properties"(属性)窗口中,取消选择 jPanel 的
opaque 属性。
- 右键单击 "JFrame",然后从弹出式菜单中选择 "Add From Pallette"(从组件面板上添加)> "Swing Controls"(Swing 控件)> "Label"(标签)。
- 在 "Projects"(项目)窗口中,右键单击
org.me.mybackgroundapp 节点,然后选择 "New"(新建)> "Java Package"(Java 包)。
- 在 "New Package"(新建包)向导中,将
.resources 添加到 org.me.mybackgroundapp 中,使新包名称为 org.me.mybackgroundapp.resources。
- 单击 "Finish"(完成)。
- 在 GUI 设计器中,选择已添加到窗体上的标签。
- 在 "Properties"(属性)窗口中,单击 "Properties"(属性)类别,然后滚动到 icon 属性。
- 单击省略号 (...) 按钮。
- 在 icon 属性对话框中,单击 "Import to Project"(导入到项目)。
- 在文件选择器中,导航到系统上要使用的任何图像。然后,单击 "Next"(下一步)。
- 在向导的 "Select Target Folder"(选择目标文件夹)页中,选择 "resources" 文件夹,然后单击 "Finish"(完成)。
- 在 "Navigator"(导航)窗口中,右键单击 "jPanel",然后从弹出式菜单中选择 "Properties"(属性)。
- 在 "Properties"(属性)对话框中,将
Grid X、Grid Y、Weight X 和 Weight Y 属性设置为 1,并将 Fill 属性设置为 Both。单击 "Close"(关闭)。
- 对 jLabel 重复执行步骤 24 和 25。
此时就完成了背景设置。现在,您可以执行拖动操作了,例如可将 jLabel 和 jTextField 拖至 "Palette"(组件面板)中的 jPanel。二者都将显示在背景图像之上。

上述解决方案的优点在于,无论是在设计时还是运行时,背景图像都会显示出来。
生成和运行应用程序
现在,已生成了用于访问和显示图像的代码,您可以生成和运行应用程序以确保能够访问该图像。
首先,您需要设置项目的主类。在设置主类后,IDE 便会知道在运行项目时运行哪个类。此外,这还会确保在生成应用程序时生成应用程序 JAR 文件中的 Main-Class 元素。
要设置项目的主类,请执行以下操作:
- 右键单击 "ImageDisplayApp" 项目节点,然后选择 "Properties"(属性)。
- 在 "Project Properties"(项目属性)对话框中,选择 "Run"(运行)类别。
- 单击 "Main Class"(主类)字段旁边的 "Browse"(浏览)按钮。接下来,选择
org.me.myimageapp.ImageDisplay 类,然后单击 "Select Main Class"(选择主类)按钮。
要生成项目,请执行以下操作:
- 选择 "Run"(运行)> "Clean & Build Main Project"(清理并生成主项目)。
可以在 "Files"(文件)窗口中查看应用程序的生成产品。build 文件夹包含编译的类。dist 文件夹包含可运行的 JAR 文件,其中包含编译的类和图像。
运行项目:
- 选择 "Run"(运行)> "Run Main Project"(运行主项目)(F6)。
创建定制代码
在很多应用程序中,无法像此示例一样以静态方式确定显示的图像。例如,用户可通过单击等操作来确定要显示的图像。
如果需要以编程方式选择要显示的图像,您可以编写自己的定制代码以访问和显示资源。IDE 禁止在 "Source"(源)视图的受保护块(包含 GUI 生成器生成的代码)中直接编写代码。不过,您可以通过属性编辑器(从 "Properties"(属性)窗口中访问)在受保护块中插入代码。通过以这种方式使用属性编辑器,可以确保在 GUI 生成器中进行设计更改时不会丢失定制代码。
例如,要为 JLabel 的 icon 属性编写定制代码,请执行以下操作:
- 在 "Design"(设计)视图或 "Inspector"(检查器)窗口中选择 JLabel。
- 在 "Properties"(属性)窗口中,单击 icon 属性旁边的省略号 (...) 按钮。
- 从对话框顶部的下拉列表中选择 "Custom Code"(定制代码)选项。
通过使用此属性编辑器中的 "Custom Code"(定制代码)选项,您可以自行填充 setIcon 方法的参数。可以使用所需的逻辑填充此参数,也可以调用在该类中的其他位置手动编写的不同方法以填充此参数。
小结
本教程说明了如何从使用 NetBeans IDE 创建的应用程序中访问图像。Java 教程进一步讨论了图像处理问题。
注意:本教程中提供的示例与 Java 教程的如何使用图标部分中的第一个示例非常相似。一个不同之处是,执行本教程时生成的代码使用 JLabel 的 setIcon 方法将图标应用于标签。在 Java 教程示例中,应用于标签的图标是通过其构造函数传递的。
另请参见