MATLAB:修改界面左上角Logo图标

MATLAB 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
function setLogo(fig, iconPath)
% 更改 UI 界面的 Logo :
%  setLogo(fig, iconPath)
%   fig 为窗口句柄
%   iconPath 为图标存放的路径,类型为 '*.png', '*.jpg', ‘.ico’等

    % 参数合法性判断
    if ~isvalid(fig),  return; end
    if ~exist(iconPath, "file"), return; end
    % 暂时关闭警告
    stuWarn = warning;
    warning('off');
   
    % 设置
    frame = get(fig, "JavaFrame");
    if ~isempty(frame)
        % JFrame 绘制
        set(frame,'FigureIcon',javax.swing.ImageIcon(iconPath));
    else
        % Chromium 绘制
        % 最长等待加载时间 3s
        limit = 3;
        rez = char();
        while ~isequal(rez, iconPath) && limit>0
            try
                % 获取webwindow句柄
                win = struct(struct(struct(fig).Controller).PlatformHost).CEF;
                win.Icon=iconPath;  
                rez = win.Icon;
            catch
                % 给图形(网页)更多时间加载
                limit = limit - 1;
                pause(1);
            end
        end
    end
    % 恢复设置
    warning(stuWarn);
end

注释

如下图所示,通过MATLAB制作的界面中,通常默认包含MATLAB的图标:
uifigure与figure的默认图标
很多时候不可避免地要修改左上角的 Logo 图标。

一般绘制图像常用的是figure,而在MATLAB的 App Designer 中,默认使用的是uifigure。虽然通过class()函数返回两者的类名称都是matlab.ui.Figure,但这两类UI在MATLAB中有着完全不同的实现方式:

  1. figure 通过 Java 语言实现,基于Java Swing中的JFrame类进行绘制,因此可以使用get()方法获取figure的JavaFrame相关句柄;
  2. uifigure 通过 JavaScript 语言实现,基于DOJO和内嵌Chromium实现,所以可以使用CEF接口进行操作。
    底层实现的差别

遇到的问题

uifigure 需要使用的*.ico格式图像,在figure中却无法打开。正如下图所示,修改后 figure 中没了默认图标,但正确图标也没有显示出来。后来更换 figure 界面的logo为*.png格式才正常显示。
figure修改不成功

参考链接

MATLAB App Designer教程连载6: App Designer的局限性
matlab如何修改GUI的图标 左上角的logo
Matlab App Designer 中如何将左上角matlab图标更改为自己的logo?