杰瑞科技汇

java swing java图标

Icon 接口简介

Icon 接口只有三个核心方法,所有图标类都必须实现它们:

java swing java图标-图1
(图片来源网络,侵删)
  1. int getIconWidth(): 返回图标的宽度(以像素为单位)。
  2. int getIconHeight(): 返回图标的高度(以像素为单位)。
  3. void paintIcon(Component c, Graphics g, int x, int y): 在指定的位置 (x, y) 上,使用 Graphics 对象 g 将图标绘制到组件 c 上。

Swing 内置的图标类

Swing 提供了几个内置的图标类,用于显示常见的图形元素。

a. ImageIcon

这是最常用、最直接的图标类,它直接从一个图像文件创建图标。

如何使用:

  1. 准备图片文件:将你的图片(如 .png, .jpg, .gif)放在项目的 src 目录下(或任何在 classpath 中的位置)。
  2. 创建 ImageIcon 实例:使用 new ImageIcon("路径/文件名")
  3. 应用到组件:使用组件的 setIcon(icon) 方法。

示例代码:

java swing java图标-图2
(图片来源网络,侵删)
import javax.swing.*;
import java.awt.*;
public class ImageIconDemo {
    public static void main(String[] args) {
        // 1. 创建 JFrame 窗口
        JFrame frame = new JFrame("ImageIcon 示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setLayout(new FlowLayout()); // 使用流式布局
        // 2. 假设你的图片名为 "my_icon.png" 并且在 src 目录下
        //    如果图片在包内,com.example.images,路径应为 "com/example/images/my_icon.png"
        ImageIcon icon = new ImageIcon("src/my_icon.png"); // 请确保路径正确
        // 3. 创建 JLabel 并设置图标
        JLabel labelWithIcon = new JLabel("这是一个带图标的标签", icon, JLabel.CENTER);
        labelWithIcon.setHorizontalTextPosition(JLabel.CENTER); // 文字在图标中间
        labelWithIcon.setVerticalTextPosition(JLabel.BOTTOM);  // 文字在图标下方
        // 4. 将标签添加到窗口
        frame.add(labelWithIcon);
        // 5. 显示窗口
        frame.setVisible(true);
    }
}

ImageIcon 的优点和注意事项:

  • 优点:简单直观,支持所有常见的图像格式。
  • 注意事项
    • 路径问题:路径是相对于运行时的工作目录(通常是项目根目录)的,将图片放在 src 目录下是一个好习惯,因为 Maven/Gradle 等构建工具会将其复制到最终的输出目录中。
    • 线程安全ImageIcon 的加载是同步的,如果图片很大或网络图片,可能会阻塞 Event Dispatch Thread (EDT),导致界面卡顿,对于大图或需要异步加载的场景,应考虑使用 ImageIO 配合 SwingWorker

b. javax.swing.plaf.metal.MetalIconFactory

这个类提供了一套标准的、与 Look and Feel 相关的图标,主要用于自定义 Swing 组件的外观。

示例:获取一个文件夹图标并应用到按钮

import javax.swing.*;
import java.awt.*;
public class MetalIconDemo {
    public static void main(String[] args) {
        JFrame frame = new JFrame("MetalIconFactory 示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLayout(new FlowLayout());
        // 从 MetalIconFactory 获取一个文件夹图标
        Icon folderIcon = MetalIconFactory.getTreeFolderIcon();
        // 创建一个按钮并设置图标
        JButton button = new JButton("打开文件夹");
        button.setIcon(folderIcon);
        frame.add(button);
        frame.setVisible(true);
    }
}

其他可用的图标:

java swing java图标-图3
(图片来源网络,侵删)
  • getTreeOpenIcon(): 打开的文件夹图标
  • getTreeLeafIcon(): 文件图标
  • getCheckBoxIcon(): 复选框图标
  • getRadioButtonIcon(): 单选框图标
  • 等等...

创建自定义图标

如果你想实现自己的图标(绘制一个简单的图形),你可以创建一个实现 Icon 接口的类。

示例:绘制一个红绿相间的圆形图标

import javax.swing.*;
import java.awt.*;
// 1. 创建一个实现 Icon 接口的类
public class CustomColorIcon implements Icon {
    private int width;
    private int height;
    public CustomColorIcon(int width, int height) {
        this.width = width;
        this.height = height;
    }
    @Override
    public int getIconWidth() {
        return width;
    }
    @Override
    public int getIconHeight() {
        return height;
    }
    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        // 2. 在 paintIcon 方法中实现绘制逻辑
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        // 绘制红色半圆
        g2d.setColor(Color.RED);
        g2d.fillArc(x, y, width, height, 90, 180);
        // 绘制绿色半圆
        g2d.setColor(Color.GREEN);
        g2d.fillArc(x, y, width, height, 270, 180);
    }
}
// 测试类
class CustomIconDemo {
    public static void main(String[] args) {
        JFrame frame = new JFrame("自定义图标示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 200);
        frame.setLayout(new FlowLayout());
        // 3. 创建自定义图标实例
        Icon myIcon = new CustomColorIcon(64, 64);
        // 4. 创建标签并应用自定义图标
        JLabel label = new JLabel("这是一个自定义图标", myIcon, JLabel.CENTER);
        label.setHorizontalTextPosition(JLabel.CENTER);
        label.setVerticalTextPosition(JLabel.BOTTOM);
        frame.add(label);
        frame.setVisible(true);
    }
}

高级用法:从 BufferedImage 创建图标

当你需要对图像进行更复杂的处理(如缩放、滤镜)时,通常会先使用 BufferedImage,然后再将其转换为 ImageIcon

示例:加载一张图片,缩放后创建图标

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
public class BufferedImageIconDemo {
    public static void main(String[] args) {
        JFrame frame = new JFrame("BufferedImage 图标示例");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        frame.setLayout(new FlowLayout());
        try {
            // 1. 使用 ImageIO 读取图片到 BufferedImage
            BufferedImage originalImage = ImageIO.read(new BufferedImageIconDemo().getClass().getResource("/my_icon.png"));
            // 2. 定义目标尺寸
            int newWidth = 100;
            int newHeight = 100;
            // 3. 创建一个新的 BufferedImage 用于绘制缩放后的图像
            BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2d = scaledImage.createGraphics();
            g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g2d.drawImage(originalImage, 0, 0, newWidth, newHeight, null);
            g2d.dispose();
            // 4. 从 BufferedImage 创建 ImageIcon
            ImageIcon scaledIcon = new ImageIcon(scaledImage);
            // 5. 应用到 JLabel
            JLabel label = new JLabel("缩放后的图标", scaledIcon, JLabel.CENTER);
            frame.add(label);
        } catch (IOException e) {
            e.printStackTrace();
            JLabel errorLabel = new JLabel("无法加载图片: " + e.getMessage());
            frame.add(errorLabel);
        }
        frame.setVisible(true);
    }
}

注意getResource("/my_icon.png") 中的 表示从 classpath 的根目录开始查找。

图标类型 用途 优点 缺点/注意事项
ImageIcon 从文件加载标准图片 简单、常用 路径管理,可能阻塞 EDT
MetalIconFactory 获取标准 L&F 图标 风格统一,适合自定义组件 主题相关,样式有限
自定义 Icon 绘制矢量图形或复杂逻辑 灵活度高,可动态生成 需要手动实现绘制逻辑
BufferedImage 图像处理(缩放、滤镜) 功能强大,适合高级图像操作 代码量稍多,涉及 AWT 图形处理

在大多数情况下,ImageIcon 是你的首选,当你需要与 Swing 的标准外观保持一致时,使用 MetalIconFactory,当你需要绘制不是来自文件的图形时,实现 自定义 Icon 接口是最佳选择。

分享:
扫描分享到社交APP
上一篇
下一篇