58.md 7.5 KB
Newer Older
W
wizardforcel 已提交
1 2 3 4
# 用 Java 显示图像

原文:http://zetcode.com/java/displayimage/

W
wizardforcel 已提交
5
在 Java 中显示图像教程介绍了如何在 Java 中显示图像。 我们展示了如何使用命令行工具 Ant,Maven,NetBeans 和 Eclipse 构建项目。 源代码和图像可在作者的 [Github 仓库](https://github.com/janbodnar/Display-Image)中获得。
W
wizardforcel 已提交
6 7 8

初学者程序员经常在项目中显示图像时遇到问题。 问题在于正确识别图像文件的路径。 关键部分是要认识到图像文件的相对路径是从项目目录开始的。 创建本教程的目的是使事情变得清楚。

W
wizardforcel 已提交
9
以下示例显示了该应用的屏幕截图。
W
wizardforcel 已提交
10

W
wizardforcel 已提交
11 12
![Displaying image in Java](img/95d468245c96cac27ebb0448c753e58a.jpg)

W
wizardforcel 已提交
13
图:用 Java 显示图像
W
wizardforcel 已提交
14 15 16 17 18 19 20 21 22



## 源代码

在这里,我们提供了用于在 Java 中显示图像的源代码。

`DisplayImage.java`

W
wizardforcel 已提交
23
```java
W
wizardforcel 已提交
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
package com.zetcode;

import java.awt.Container;
import java.awt.EventQueue;
import javax.swing.GroupLayout;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class DisplayImage extends JFrame {

    public DisplayImage() {

        initUI();
    }

    private void initUI() {       

        ImageIcon ii = loadImage();

        JLabel label = new JLabel(ii);

        createLayout(label);

        setTitle("Image");
        setLocationRelativeTo(null);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    private ImageIcon loadImage() {

        ImageIcon ii = new ImageIcon("simg/snake.jpg");
        return ii;
    }

    private void createLayout(JComponent... arg) {

        Container pane = getContentPane();
        GroupLayout gl = new GroupLayout(pane);
        pane.setLayout(gl);

        gl.setAutoCreateContainerGaps(true);

        gl.setHorizontalGroup(gl.createSequentialGroup()
                .addComponent(arg[0])
        );

        gl.setVerticalGroup(gl.createParallelGroup()
                .addComponent(arg[0])
        );

        pack();
    }

    public static void main(String[] args) {

        EventQueue.invokeLater(() -> {
            DisplayImage ex = new DisplayImage();
            ex.setVisible(true);
        });
    }
}

```

W
wizardforcel 已提交
90
该示例创建一个 Java Swing 应用,并使用`ImageIcon`组件显示图像。
W
wizardforcel 已提交
91

W
wizardforcel 已提交
92
```java
W
wizardforcel 已提交
93 94 95 96 97 98 99 100 101 102 103 104
private ImageIcon loadImage() {

    ImageIcon ii = new ImageIcon("simg/snake.jpg");
    return ii;
}

```

重要的部分在这里。 `ImageIcon`采用图像的文件路径。 该文件路径取决于我们使用的构建工具。

## 使用命令行工具显示图像

W
wizardforcel 已提交
105
第一个示例使用命令行工具构建 Java 应用。
W
wizardforcel 已提交
106

W
wizardforcel 已提交
107
```java
W
wizardforcel 已提交
108 109 110 111 112 113 114
$ mkdir bin
$ mkdir -p src/main/com/zetcode/
$ mkdir src/maimg
$ cp ~/Pictures/snake.jpg src/maimg/

```

W
wizardforcel 已提交
115
我们创建项目结构并将图像复制到`images`目录。
W
wizardforcel 已提交
116

W
wizardforcel 已提交
117
```java
W
wizardforcel 已提交
118 119 120 121 122 123 124 125
private ImageIcon loadImage() {

    ImageIcon ii = new ImageIcon("src/maimg/snake.jpg");
    return ii;
}

```

W
wizardforcel 已提交
126
在命令行应用中,我们使用了`src/maimg/snake.jpg`路径。
W
wizardforcel 已提交
127

W
wizardforcel 已提交
128
```java
W
wizardforcel 已提交
129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
$ tree
.
├── bin
└── src
    └── main
        ├── com
           └── zetcode
               └── DisplayImage.java
        └── images
            └── snake.jpg

6 directories, 2 files

```

这就是项目目录结构的样子。

W
wizardforcel 已提交
146
```java
W
wizardforcel 已提交
147 148 149 150
$ javac -d bin src/main/com/zetcode/DisplayImage.java 

```

W
wizardforcel 已提交
151
该应用使用`javac`工具进行编译。
W
wizardforcel 已提交
152

W
wizardforcel 已提交
153
```java
W
wizardforcel 已提交
154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
$ tree
.
├── bin
   └── com
       └── zetcode
           └── DisplayImage.class
└── src
    └── main
        ├── com
           └── zetcode
               └── DisplayImage.java
        └── images
            └── snake.jpg

8 directories, 3 files

```

编译源代码后,我们在`bin/com/zetcode`子目录中创建了一个 Java 类文件。

W
wizardforcel 已提交
174
```java
W
wizardforcel 已提交
175 176 177 178
$ java -cp bin com.zetcode.DisplayImage 

```

W
wizardforcel 已提交
179
我们使用`java`命令运行该应用。
W
wizardforcel 已提交
180 181 182 183 184

## 使用 Ant 构建项目

在本节中,我们将使用 Ant 构建工具来创建项目。

W
wizardforcel 已提交
185
```java
W
wizardforcel 已提交
186 187 188 189 190 191 192 193
$ mkdir -p src/main/com/zetcode/
$ mkdir src/maimg
$ cp ~/Pictures/snake.jpg src/maimg/

```

我们创建目录并复制图像文件。

W
wizardforcel 已提交
194
```java
W
wizardforcel 已提交
195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
$ tree
.
├── build.xml
└── src
    └── main
        ├── com
           └── zetcode
               └── DisplayImage.java
        └── images
            └── snake.jpg

5 directories, 3 files

```

使用`tree`命令,显示项目的目录结构。

`build.xml`

W
wizardforcel 已提交
214
```java
W
wizardforcel 已提交
215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
<?xml version="1.0"?>
<project name="DisplayImage" default="compile">

  <target name="init">
        <mkdir dir="build/classes"/>
  </target>

  <target name="compile" depends="init">
        <javac includeantruntime="false" srcdir="src" destdir="build/classes"/>
  </target>

  <target name="clean">        
        <delete dir="build"/>
  </target>
</project>

```

这是 Ant 构建文件。 我们有创建目录,编译源代码和清理的任务。

W
wizardforcel 已提交
235
```java
W
wizardforcel 已提交
236 237 238 239 240 241 242 243 244 245
private ImageIcon loadImage() {

    ImageIcon ii = new ImageIcon("src/maimg/snake.jpg");
    return ii;
}

```

我们使用`src/maimg/snake.jpg`路径。

W
wizardforcel 已提交
246
```java
W
wizardforcel 已提交
247 248 249 250 251 252 253 254 255 256 257 258 259 260 261
$ ant
Buildfile: /home/janbodnar/prog/javaimages/displayimageant/build.xml

init:

compile:
    [javac] Compiling 1 source file to /home/janbodnar/prog/javaimages/displayimageant/build/classes

BUILD SUCCESSFUL
Total time: 2 seconds

```

我们建立项目。

W
wizardforcel 已提交
262
```java
W
wizardforcel 已提交
263 264 265 266
$ java -cp build/classes/ com.zetcode.DisplayImage

```

W
wizardforcel 已提交
267
该应用启动。
W
wizardforcel 已提交
268 269 270

## 在 NetBeans 中显示图像

W
wizardforcel 已提交
271
在 NetBeans 中,我们创建一个 Java 应用。
W
wizardforcel 已提交
272 273 274

我们创建一个新文件夹。 我们右键单击“源包”,然后选择“新建—文件夹”。

W
wizardforcel 已提交
275 276
![Creating a folder in NetBeans](img/6f6f8c457cb3cdb65733f76e686fb4c9.jpg)

W
wizardforcel 已提交
277
图:在 NetBeans 中创建一个文件夹
W
wizardforcel 已提交
278 279 280 281 282



我们将文件夹称为`images`。 其父目录为`src`。 使用拖放操作,将`snake.jpg`文件复制到`images`子目录。

W
wizardforcel 已提交
283
```java
W
wizardforcel 已提交
284 285 286 287 288 289 290 291 292 293
private ImageIcon loadImage() {

    ImageIcon ii = new ImageIcon("simg/snake.jpg");
    return ii;
}

```

在 NetBeans 中,我们使用了`simg/snake.jpg`路径。

W
wizardforcel 已提交
294
```java
W
wizardforcel 已提交
295 296 297 298
System.out.println(System.getProperty("user.dir"));

```

W
wizardforcel 已提交
299
该应用的当前工作目录是项目目录,在本例中为`DisplayImageEx`。 我们可以使用`user.dir`系统属性找出当前的工作目录。 `src`目录是项目目录的子目录。
W
wizardforcel 已提交
300

W
wizardforcel 已提交
301 302
![Project in NetBeans](img/6fa513be9f5e5a300052f365c338969d.jpg)

W
wizardforcel 已提交
303
图:项目结构 in NetBeans
W
wizardforcel 已提交
304 305 306 307 308 309 310 311 312 313 314



该图显示了 NetBeans 中的实际项目结构。

## 在 Eclipse 中显示图像

在 Eclipse 中,我们创建一个 Java 项目。 我们在项目节点上单击鼠标右键,然后选择“新建—源文件夹”。

我们将文件夹名称称为`images`。 与 NetBeans 不同,它的父目录是项目文件夹。 使用拖放操作,将`snake.jpg`文件复制到`images`子目录。

W
wizardforcel 已提交
315
```java
W
wizardforcel 已提交
316 317 318 319 320 321 322 323 324 325
private ImageIcon loadImage() {

    ImageIcon ii = new ImageIcon("images/snake.jpg");
    return ii;
}

```

在 Eclipse 中,我们使用了`images/snake.jpg`路径。

W
wizardforcel 已提交
326 327
![Project in Eclipse](img/9227095962f6d8b201f91ef3d7e06f86.jpg)

W
wizardforcel 已提交
328
图:项目结构 in Eclipse
W
wizardforcel 已提交
329 330 331 332 333



该图显示了 Eclipse 中的实际项目结构。

W
wizardforcel 已提交
334
这是 Java 教程中的图像显示。 我们已经构建了一个 Swing 应用,该应用使用命令行工具,Ant,NetBeans 和 Eclipse 显示图像。 您可能还需要查看[`ImageIcon`教程](/java/imageicon/)[在 Java 中读写 ICO 文件](/articles/javaico/)[Java Swing 教程](/tutorials/javaswingtutorial/)[Java 2D 教程](/gfx/java2d/), 或 [Java 游戏教程](/tutorials/javagamestutorial/)