junziyang 发表于 2009-5-20 13:08:20

【原创】更改Figure图标的新方法

以前写过一个更改Figure图标的函数(见:http://e.simwe.com/28413/viewspace-3405和http://forum.simwe.com/redirect.php?goto=findpost&pid=1646591&ptid=603155),是通过Figure的JavaFrame实现的。遗憾的是,从R2009a开始,使用这个函数时开始出现如下警告:

      Warning: figure JavaFrame property will be obsoleted in a future release. For more information see the
      JavaFrame resource on the MathWorks Web site.

也就是说,在以后的版本中Figure的JavaFrame属性就没法用了。以前写的那个changeicon函数也会随之失灵了。

      修改Figure图标的方法不止一种,论坛里就可以找到几个方案。但JAVA方法相对来说简单一些,可以写成MATLAB中的函数来方便的调用。所以还是比较喜欢这种方法。MATLAB的界面是用JAVA实现的,理论上来说,界面上的所有东西都是可以改的!!虽然JavaFrame被封掉了,但肯定还有其他方法来改Figure的图标。经过一番研究,终于找到了这样一种方法。全部代码如下:

function chgicon(hfig,iconfile)
%CHGICON changes the Figure HFIG's icon to the icon specified by ICONFILE
% HFIG must be a figure handle.
% ICONFILE is a string specifies the path to an imagefile.
%
%WARNING:
% Changing the matlab icon violate the mathworks license. THis function can
% only be used for study purpose. Please delete it within 24 hours.
%
% Author: junziyang (simwer@126.com)
% Ver.1.0
% 2009-05-20

error(nargchk(2,2,nargin));
if ~ishandle(hfig) && ~isequal(get(hfig,'Type'),'figure')
error('The first input argument must be a Figure handle.');
end
if ~ischar(iconfile) || ~exist(iconfile,'file')
error('Icon file name is not input properly.');
end
mde = com.mathworks.mde.desk.MLDesktop.getInstance;
if isequal(get(hfig,'NumberTitle'),'off') && isempty(get(hfig,'Name'))
figTag = 'junziyang'; %Name the figure temporarily
set(hfig,'Name',figTag);
elseif isequal(get(hfig,'NumberTitle'),'on') && isempty(get(hfig,'Name'))
figTag = ['Figure ',num2str(hfig)];
elseif isequal(get(hfig,'NumberTitle'),'off') && ~isempty(get(hfig,'Name'))
figTag = get(hfig,'Name');
else
figTag = ['Figure ',num2str(hfig),': ',get(hfig,'Name')];
end
drawnow %Update figure window
jfig = mde.getClient(figTag); %Get the underlying JAVA object of the figure.
jfig.setClientIcon(javax.swing.ImageIcon(iconfile));
if isequal(get(hfig,'Name'),'junziyang')
set(hfig,'Name',''); %Delete the temporary figure name
end



修改Figure的图标违反了Mathworks的许可,所以该函数仅供研究学习之用,责任自负。

huaying_1009 发表于 2009-5-20 15:44:14

还没有仔细看junzi的函数,试了一下,改是改了,matlab的logo不见了,新的ico也没加上,什么都不见了,没编译过,不知到编译的时候能不能编译出来自己的ico。....junzi测试有什么影响吗?

ljelly 发表于 2009-5-20 16:09:40

不需要编译,直接调用就可以,是不是你调用的不对
我试过了,图标改了,新的ico加上了

junziyang 发表于 2009-5-20 16:51:09

本帖最后由 junziyang 于 2009-5-20 16:53 编辑

编译后能不能行没有试过。
建议使用分辨率32*32的图片,最好是png格式的。

huaying_1009 发表于 2009-5-20 22:32:55

是我ico问题,改用64x64的通过,请教junzi一个问题,如果是GUI编程的话有大量的figure,如何一次性全部改掉,或能不能让它返回一个handle值,存入guidata,一次性全部更新or something else....

junziyang 发表于 2009-5-21 09:38:59

这个函数只能修改已经生成的figure,hfig是Figure的句柄,没有句柄没法修改。如果GUI有好多个Figure,调用changeicon,一个一个的改。或者修改一下这个函数,里面加上个循环,一次传给他多个Figure句柄,让它一个一个的改去。感觉好像没这个必要,除非你的Figure多达几十上百个。

junziyang 发表于 2009-5-21 09:44:01

这个函数的工作原理是:
首先,获取MATLAB desktop的JAVA对象,其它的Figure、Editor、Profiler等等都是desk对象的子对象;
然后,搜索desk对象的的子对象中hfig对应的那个对象,也就是Figure的JAVA对象;
最后,通过调用Figure的JAVA对象的方法,修改其图标。

所以从原理上来说,不仅Figure的图标可以改,Editor、Profiler总之MATLAB中出现的所有窗口的图标都可以用这种方法来修改,只要你觉得必要:lol。changeicon函数中我限定了仅修改Figure的图标,这个做GUI时最为常用。

cyz_ly 发表于 2009-6-2 16:40:29

Unix或linux版的matlab没有图标,呵呵。

ChaChing 发表于 2009-11-7 12:43:31

这个好玩, 可以转至振动吗?

zhjberry 发表于 2010-6-30 18:32:45

使用junziyang 兄的代码,用一般的jpg图片试验也成功了,包括自己建立的gui、msgbox类型的对话框都成功更改图标。但是遇到使用questdlg生成的对话框却是没有办法,因为该对话框生成后等待用户输入。请问各位对此有何好的办法呢?

zhjberry 发表于 2010-7-2 09:05:30

经过试验,找到了上述问题的一个解决方法:修改questdlg.m:
......
% make sure we are on screen
movegui(QuestFig)


set(QuestFig ,'WindowStyle','modal','Visible','on');
drawnow;
chgicon(QuestFig,'xxx.jpg'); %更改窗口图标

if DefaultButton ~= 0
uicontrol(BtnHandle(DefaultButton));
end
......
questdlg.m位于 ...\toolbox\matlab\uitools,其中xxx.jpg是自己准备的图形,放在...\toolbox\matlab\uitools。
(申明:修改Mathworks源文件是非法的,这里仅作为研究探讨之用)

hyyly 发表于 2010-10-16 22:47:45

哎,我的运行出错:(

pzfs1016 发表于 2012-2-9 16:12:24

可以正确运行!

machreehappy 发表于 2012-9-25 11:53:54

太给力啦

lhg0310 发表于 2012-11-8 10:39:41

不错哦。。。。

byliling 发表于 2013-1-21 19:12:56

zhjberry 发表于 2010-7-2 09:05 static/image/common/back.gif
经过试验,找到了上述问题的一个解决方法:修改questdlg.m:
......
% make sure we are on screen


为什么我按照这个方法,没有成功呢?

wufomaidaoren 发表于 2015-4-12 21:18:35

楼主,你好。看了你这个程序,我试了试,运行后MATLAB给出
Icon file name is not input properly.
图片格式是png和jpeg都试过,图片路径和函数也一致。
MATLAB给出的这个   图标名不对    是什么意思?
多谢
页: [1]
查看完整版本: 【原创】更改Figure图标的新方法