You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Java Swing中使用FlatLaf显示URL中的SVG图片?

解决FlatSVGIcon无法加载远程URL SVG的问题

FlatSVGIcon的默认构造方法不直接支持加载远程URL的SVG资源,它会把传入的URL字符串当作本地文件路径或classpath资源去解析,这就是本地SVG能正常显示但远程资源不行的核心原因。解决思路是先下载远程SVG的内容,再通过FlatSVGIcon支持的输入流(InputStream)构造方法来创建图标。

步骤1:实现远程SVG下载工具方法

先编写一个工具方法,负责从目标URL获取SVG的输入流,同时处理网络IO相关异常:

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;

public class SVGUtils {
    public static InputStream getRemoteSVGInputStream(String svgUrl) throws IOException {
        URL url = new URL(svgUrl);
        return url.openStream();
    }
}

步骤2:修改SVGImage类适配远程资源加载

修改setSvgImage方法,区分本地资源和远程URL:对于远程资源,用SwingWorker异步下载(避免阻塞Swing事件调度线程,防止UI卡顿),再通过输入流构造FlatSVGIcon;本地资源保持原有逻辑即可:

import com.formdev.flatlaf.extras.FlatSVGIcon;
import javax.swing.JLabel;
import javax.swing.SwingWorker;
import java.io.InputStream;

public class SVGImage extends JLabel {

    private FlatSVGIcon svgIcon;

    public void setSvgImage(String image, int width, int height) {
        // 判断是否为远程URL资源
        if (image.startsWith("http://") || image.startsWith("https://")) {
            new SwingWorker<FlatSVGIcon, Void>() {
                @Override
                protected FlatSVGIcon doInBackground() throws Exception {
                    // 后台线程执行网络下载
                    try (InputStream inputStream = SVGUtils.getRemoteSVGInputStream(image)) {
                        return new FlatSVGIcon(inputStream, width, height);
                    }
                }

                @Override
                protected void done() {
                    // 回到EDT线程更新UI
                    try {
                        svgIcon = get();
                        setIcon(svgIcon);
                    } catch (Exception e) {
                        e.printStackTrace();
                        // 加载失败时可设置提示文本或默认图标
                        setText("国旗加载失败");
                    }
                }
            }.execute();
        } else {
            // 本地资源/Classpath资源,沿用原有逻辑
            svgIcon = new FlatSVGIcon(image, width, height);
            setIcon(svgIcon);
        }
    }
}

步骤3:保持原有调用方式不变

你的MainJFrame中的调用代码无需修改,依然可以直接传入远程URL:

sVGImage1.setSvgImage("https://media.api-sports.io/flags/gb.svg", 300, 300);

额外注意事项

  • 确保程序具备网络访问权限,若在受安全管理器限制的环境中运行,需配置对应网络权限。
  • 可添加本地缓存逻辑,避免重复下载相同SVG资源,提升后续加载效率。
  • 异常处理部分可根据业务需求优化,比如替换为错误图标而非文本提示。

内容的提问来源于stack exchange,提问作者user17121955

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 13:30:42