找回密码
 注册
Simdroid-非首页
查看: 669|回复: 16

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

[复制链接]
发表于 2009-5-20 13:08:20 | 显示全部楼层 |阅读模式 来自 天津
以前写过一个更改Figure图标的函数(见:http://e.simwe.com/28413/viewspace-3405http://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的图标。经过一番研究,终于找到了这样一种方法。全部代码如下:

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

  13. error(nargchk(2,2,nargin));
  14. if ~ishandle(hfig) && ~isequal(get(hfig,'Type'),'figure')
  15. error('The first input argument must be a Figure handle.');
  16. end
  17. if ~ischar(iconfile) || ~exist(iconfile,'file')
  18. error('Icon file name is not input properly.');
  19. end
  20. mde = com.mathworks.mde.desk.MLDesktop.getInstance;
  21. if isequal(get(hfig,'NumberTitle'),'off') && isempty(get(hfig,'Name'))
  22. figTag = 'junziyang'; %Name the figure temporarily
  23. set(hfig,'Name',figTag);
  24. elseif isequal(get(hfig,'NumberTitle'),'on') && isempty(get(hfig,'Name'))
  25. figTag = ['Figure ',num2str(hfig)];
  26. elseif isequal(get(hfig,'NumberTitle'),'off') && ~isempty(get(hfig,'Name'))
  27. figTag = get(hfig,'Name');
  28. else
  29. figTag = ['Figure ',num2str(hfig),': ',get(hfig,'Name')];
  30. end
  31. drawnow %Update figure window
  32. jfig = mde.getClient(figTag); %Get the underlying JAVA object of the figure.
  33. jfig.setClientIcon(javax.swing.ImageIcon(iconfile));
  34. if isequal(get(hfig,'Name'),'junziyang')
  35. set(hfig,'Name',''); %Delete the temporary figure name
  36. end
复制代码



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

评分

1

查看全部评分

发表于 2009-5-20 15:44:14 | 显示全部楼层 来自 北京海淀
Simdroid开发平台
还没有仔细看junzi的函数,试了一下,改是改了,matlab的logo不见了,新的ico也没加上,什么都不见了,没编译过,不知到编译的时候能不能编译出来自己的ico。....junzi测试有什么影响吗?
回复 不支持

使用道具 举报

发表于 2009-5-20 16:09:40 | 显示全部楼层 来自 北京
不需要编译,直接调用就可以,是不是你调用的不对
我试过了,图标改了,新的ico加上了
回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-20 16:51:09 | 显示全部楼层 来自 天津
本帖最后由 junziyang 于 2009-5-20 16:53 编辑

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

使用道具 举报

发表于 2009-5-20 22:32:55 | 显示全部楼层 来自 北京海淀
是我ico问题,改用64x64的通过,请教junzi一个问题,如果是GUI编程的话有大量的figure,如何一次性全部改掉,或能不能让它返回一个handle值,存入guidata,一次性全部更新or something else....
回复 不支持

使用道具 举报

 楼主| 发表于 2009-5-21 09:38:59 | 显示全部楼层 来自 天津
这个函数只能修改已经生成的figure,hfig是Figure的句柄,没有句柄没法修改。如果GUI有好多个Figure,调用changeicon,一个一个的改。或者修改一下这个函数,里面加上个循环,一次传给他多个Figure句柄,让它一个一个的改去。感觉好像没这个必要,除非你的Figure多达几十上百个。
回复 不支持

使用道具 举报

 楼主| 发表于 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时最为常用。

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2009-6-2 16:40:29 | 显示全部楼层 来自 河北保定
Unix或linux版的matlab没有图标,呵呵。
回复 不支持

使用道具 举报

发表于 2009-11-7 12:43:31 | 显示全部楼层 来自 台湾
这个好玩, 可以转至振动吗?
回复 不支持

使用道具 举报

发表于 2010-6-30 18:32:45 | 显示全部楼层 来自 北京
使用junziyang 兄的代码,用一般的jpg图片试验也成功了,包括自己建立的gui、msgbox类型的对话框都成功更改图标。但是遇到使用questdlg生成的对话框却是没有办法,因为该对话框生成后等待用户输入。请问各位对此有何好的办法呢?
回复 不支持

使用道具 举报

发表于 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源文件是非法的,这里仅作为研究探讨之用)

评分

1

查看全部评分

回复 不支持

使用道具 举报

发表于 2010-10-16 22:47:45 | 显示全部楼层 来自 广西柳州
哎,我的运行出错:(
回复 不支持

使用道具 举报

发表于 2012-2-9 16:12:24 | 显示全部楼层 来自 湖北武汉
可以正确运行!
回复 不支持

使用道具 举报

发表于 2012-9-25 11:53:54 | 显示全部楼层 来自 甘肃兰州
太给力啦
回复 不支持

使用道具 举报

发表于 2012-11-8 10:39:41 | 显示全部楼层 来自 河南焦作
不错哦。。。。
回复 不支持

使用道具 举报

发表于 2013-1-21 19:12:56 | 显示全部楼层 来自 宁波大学
zhjberry 发表于 2010-7-2 09:05
经过试验,找到了上述问题的一个解决方法:修改questdlg.m:
......
% make sure we are on screen

为什么我按照这个方法,没有成功呢?
回复 不支持

使用道具 举报

发表于 2015-4-12 21:18:35 | 显示全部楼层 来自 四川成都
楼主,你好。看了你这个程序,我试了试,运行后MATLAB给出
Icon file name is not input properly.
图片格式是png和jpeg都试过,图片路径和函数也一致。
MATLAB给出的这个   图标名不对    是什么意思?
多谢
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-4-27 21:55 , Processed in 0.051894 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表