如何在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
相关产品推荐
相关产品推荐

