HOWTO · Java
在 Java 中创建图像图标
本教程演示了如何在 Java 中创建图像图标。
本页内容
在 Swing 中,ImageIcon 表示一张图像,可绘制到组件中,也可附加到 JButton 上。以下示例展示这两种做法;在可用的图形环境中使用 --show 运行时,会在窗口中显示结果。示例会在内存中创建图像;若要使用图像文件,请提供应用程序能够访问的路径或类路径资源。
在 Java 中使用 ImageIcon 绘制图像
要在自定义面板中绘制图标,先加载或创建 ImageIcon,再根据图标尺寸设置面板的首选大小,并覆盖 paintComponent。调用 paintIcon(this, g, x, y) 之前,先调用 super.paintComponent(g),让 Swing 在绘制前准备好面板。此示例会在内存中创建一张小图像,并在 Swing 的事件派发线程上启动 GUI 设置。不带参数运行时,示例会在无头模式下安全地完成绘制;在可用的图形环境中传入 --show,则会在窗口中显示面板:
运行此示例:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Main {
private static class IconPanel extends JPanel {
private final ImageIcon icon;
IconPanel(ImageIcon icon) {
this.icon = icon;
setPreferredSize(new Dimension(icon.getIconWidth(), icon.getIconHeight()));
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
icon.paintIcon(this, g, 0, 0);
}
}
public static void main(String[] args) {
boolean showWindow = args.length > 0 && "--show".equals(args[0]);
if (!showWindow) {
System.setProperty("java.awt.headless", "true");
}
BufferedImage source = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
Graphics2D sourceGraphics = source.createGraphics();
sourceGraphics.setColor(Color.BLUE);
sourceGraphics.fillRect(0, 0, 16, 16);
sourceGraphics.dispose();
ImageIcon icon = new ImageIcon(source);
SwingUtilities.invokeLater(() -> {
if (showWindow) {
JFrame frame = new JFrame("Paint an ImageIcon");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new IconPanel(icon));
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
System.out.println("Icon size: " + icon.getIconWidth() + "x" + icon.getIconHeight());
});
}
}
Icon size: 16x16
面板使用图标的宽度和高度作为尺寸,paintComponent 会从左上角开始绘制图标。不带参数运行时,程序只在无头模式下创建图标并打印其尺寸;只有在图形会话中带 --show 运行时,图标才会真正绘制到面板中。若要改为加载图像文件,可使用类似 new ImageIcon("delftstack.jpg") 的路径来创建图标;请将文件放在应用程序的工作目录中,或提供正确路径。文件缺失或无法读取时,无法得到预期的图标,因此请根据进程的工作目录确认路径。在已打包的应用程序中,类路径资源通常比相对于工作目录的路径更可靠。此示例使用内存中的图像,不依赖该外部文件。示例会打印图标的宽度和高度;输出区块中的英文标签保持原样。
将 ImageIcon 添加到 Java 按钮
将 ImageIcon 传给 JButton 构造函数,即可在按钮上显示图像。此示例会在内存中创建三个图标,并将对应的按钮添加到使用 FlowLayout 的 JPanel 中。不带参数运行时,示例会在无头模式下安全地创建按钮;在可用的图形环境中传入 --show,则会在窗口中显示这些按钮:
运行此示例:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.image.BufferedImage;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Main {
private static ImageIcon makeIcon(Color color) {
BufferedImage image = new BufferedImage(16, 16, BufferedImage.TYPE_INT_ARGB);
image.setRGB(8, 8, color.getRGB());
return new ImageIcon(image);
}
public static void main(String[] args) {
boolean showWindow = args.length > 0 && "--show".equals(args[0]);
if (!showWindow) {
System.setProperty("java.awt.headless", "true");
}
SwingUtilities.invokeLater(() -> {
JButton facebookButton = new JButton(makeIcon(Color.BLUE));
JButton twitterButton = new JButton(makeIcon(Color.CYAN));
JButton emailButton = new JButton(makeIcon(Color.RED));
JPanel buttonPanel = new JPanel(new FlowLayout());
buttonPanel.add(facebookButton);
buttonPanel.add(twitterButton);
buttonPanel.add(emailButton);
if (showWindow) {
JFrame frame = new JFrame("ImageIcon Buttons");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(buttonPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
System.out.println("Buttons created: "
+ facebookButton.getIcon().getIconWidth() + ", "
+ twitterButton.getIcon().getIconWidth() + ", "
+ emailButton.getIcon().getIconWidth());
});
}
}
Buttons created: 16, 16, 16
若要使用图像文件,可将每个 makeIcon(...) 调用替换为类似 new ImageIcon("facebook.png")、new ImageIcon("twitter.png") 或 new ImageIcon("email.png") 的图标。请将这些文件放在应用程序使用的路径下,或将它们作为类路径资源加载,并确认每条路径都能从应用程序的工作目录解析。FlowLayout 会将三个按钮排列在面板的一行中;面板随后会添加到窗口中以供显示。此示例分别展示 Facebook、Twitter 和电子邮件图标按钮的用法,以及如何在自定义面板中绘制图标。示例会打印图标尺寸;输出区块中的英文标签保持原样。