找到java容器或Matlab GUI句柄中包含的所有java对象
如果没有指定输出参数,那么将显示一个交互式GUI窗口,其中包含所有容器组件、它们的属性和回调的树状视图。
语法:
[handles,levels, parentid,listing] = findjobj(container,'PropName',PropValue(s),…)
输入:
- container -可选的GUI句柄。如果没有提供,那么当前的数字将被使用
- 'PropName',PropValue -可选的不区分大小写的属性对列表。PropName也可以命名为-PropName。
金宝app支持的属性:
- 'position' -根据包含指定X,Y位置或java元素的元素过滤结果
注意:指定Matlab的位置(X,Y =左下角的像素),而不是java的位置
- 'size' -根据具有指定W,H的元素过滤结果(以像素为单位)
- 'class' -根据那些包含PropValue子字符串(或java类)的元素过滤结果
注意:过滤是不区分大小写的,并且依赖于regexp,所以您可以传递通配符等。
- 'property' -根据具有指定的不区分大小写的属性字符串或具有单元格数组格式的属性值的元素过滤结果:{'propName', 'propValue'}。例如:findjobj(…,'property', {'Text','click me'})
- 'depth' -根据指定的深度过滤结果。0=顶级,Inf=所有级别(默认=Inf)
- 'flat' -同:'depth',0
'not','class','c'返回除类为'c'外的所有元素
- 'persist' -持久化图形组件信息,为后续调用提供更快的结果
- 'print' -在一个分层列表中显示所有Java元素
注释1:java容器的元素索引或句柄的可选PropValue
注2:一般情况下,在所有筛选完成后,该选项会放在最后。
- 'list' -与'print'相同
输出:
- handles Java元素句柄列表
- levels - Java元素对应层次结构级别的列表(top=0)
- parentIds -对应java元素的父容器的索引列表(在未过滤句柄中)
- list - 'print'/'list'选项的结果(如果'print'/'list'未指定则为空)
示例用法:
>> hButton = uicontrol('string','点击我');
>> jButton = findjobj(hButton,'nomenu');% or: jButton = findjobj('property',{'Text','点击我'});
> > jButton.setFlyOverAppearance (1);
> > jButton.setCursor (java.awt.Cursor.getPredefinedCursor (java.awt.Cursor.HAND_CURSOR));
> >设置(jButton FocusGainedCallback, @myMatlabFunction);大约30个回调点可用…
> > jButton.get;列出所有可更改的属性…
>> hEditbox = uicontrol('style',edit');
>> jEditbox = findjobj(hEditbox,'nomenu');
> > jEditbox.setCaretColor (java.awt.Color.red);
> > jEditbox。KeyTypedCallback = @myCallbackFunc;%更多的回调从这里来…
> > jEdit.requestFocus;
(在实用工具的帮助部分中有更多示例)
已知问题/限制:
-当前不能处理多个容器对象-一次只能处理一个
当图形加载了很多UI组件时,初始处理会有点慢(所以最好使用“persist”)
传递一个容器Matlab句柄目前是通过位置+大小找到的:应该找到更好的方法来做到这一点
-标签在java中有一个只写文本的属性,所以不能使用'property',{' text ','string'}符号
技术描述:
*https://UndocumentedMatlab.com/articles/findjobj-find-underlying-java-object
*https://UndocumentedMatlab.com/articles/findjobj-gui-display-container-hierarchy
警告:
此代码严重依赖于未文档化和不支持的Matlab功能。金宝app它适用于Matlab 7+,但使用风险自负!
bug和建议:
请发送给Yair Altman (altmany at gmaildot com)
参见:
Java, handle, findobj, findall
亚伊尔·奥特曼(2021)。查找Matlab图形对象的java句柄(//www.tatmou.com/matlabcentral/fileexchange/14317-findjobj-find-java-handles-of-matlab-graphic-objects), MATLAB中央文件交换。检索.
启发:检查时间序列事件,BacStalk,BiofilmQ,调整,kristinbranson / JAABA,MATLAB代码片段,股票交易者杂志,directorscut82 / matbuttons,显微图像浏览器(MIB),attachScrollPanelTo -添加滚动面板到一个uipanel或轴,显微图像浏览器2 (MIB2),状态栏,getjframe -检索图形的底层Java帧,启用/禁用整个图形窗口,setDesktopVisibility,UIINSPECT -显示对象的方法、属性和回调,管理和停靠数字到组,虚拟Tackball,最大化,uhelp,命令窗口文本,图形化的包装,Reorderable列表框,为文档栏上色,SVN工具栏集成,Sim.I.am,实时交易Matlab和IB演示文件,fixuilabels,以编程方式滚动变量编辑器,Embeddedmethodsviewer -显示matlab编辑器中的函数和方法,来自文本文件的图(支持HTML标记)金宝app,恐慌模拟器,tprintf—打印到第二个终端窗口,GavriYashar / Matlab-Editor-Plugin,复制粘贴,概率分布仪,动态搜索框,checkVersion—在文件交换中检查更新的文件版本,Figs2tabs -将图形移动到单个选项卡GUI中,Dicom操作符- EsmeProcess,国际象棋大师,smart_scrollbars修复了Matlab的列表框/编辑框滚动条,使其仅在需要时显示,消息记录器,scatool,SessionManager,kview -信号/数据易于可视化和处理的接口
@Daniel使用findjobj_fast直接或更好,使用回调的改变值从编辑框本身,这是更快,更容易实现。
谢谢你,Yair提供了这么多功能。它们被惊人地执行了,你基本上拯救了我。我使用Matlab 2019a,在GUIDE中制作了一个复杂的GUI。我正在寻找一个解决方案,以动态分析输入字符串从编辑框。
我只是想指出,使用' nommenu '选项会阻碍findjobj的性能,而它应该改善它(?)。我是不是遗漏了什么?当添加“nommenu”参数时,我在~800ms内得到了我想要的结果,而在删除它(不使用输入参数)后,我在~20ms内得到了响应。正如预期的那样,使用findjobj_fast在8毫秒内从编辑框返回结果!
简而言之,这样更慢:
函数editboxValue_ButtonDownFcn(hObject, eventdata, handles)
抽搐
editboxValueValue_Obj = findjobj_fast(handles.editboxValue);
editboxString = get(editboxValueValue_Obj, 'Text');
toc
fprintf('输入字符串:%s\n', editboxString)
guidata (hObject,处理)
——>对象和字符串在8毫秒内找到
比这个:
函数editboxValue_ButtonDownFcn(hObject, eventdata, handles)
抽搐
editboxValueValue_Obj = findjobj_fast(句柄。editboxValue nomenu);
editboxString = get(editboxValueValue_Obj, 'Text');
toc
fprintf('输入字符串:%s\n', editboxString)
guidata (hObject,处理)
——>对象和字符串在~800ms内找到
这篇文章在很多方面都很有帮助,我真的很感激花时间来保持它的最新。仅供其他用户参考,在未来的版本中,Matlab将不再支持本次提交中使用的JavaFrame属性和javacomponent函数。金宝app更多信息://www.tatmou.com/下载188bet金宝搏products/matlab/app-designer/java-swing-alternatives.html
MATLAB R2019b将警告的ID MATLAB:HandleGraphics:ObsoletedProperty:JavaFrame更改为MATLAB:ui: JavaFrame:PropertyToBeRemoved,因此该函数中的警告抑制需要更新,尽管功能本身似乎仍然正常工作!
谢谢你的更新,Yair!findjobj的最新版本(7/3/19)似乎修复了我在MATLAB R2018b/R2019a中使用9/21/18版本时遇到的问题。
奇妙的工具!非常感谢创建它,并保持它的最新。
@Yair -我也不认为findjobj有问题。不幸的是,Mathworks技术支持部门决定不再调查此事。金宝app
@Boyd -我不相信问题是在findjobj,但在任何情况下,你有一个简单的替代标签:https://undocumentedmatlab.com/blog/transparent-labels
我一直在使用这个函数来让我改变uicontrol的背景为透明(函数如下)。在更新到2019a时,由于内存泄漏,我的代码开始崩溃(在2018b和以前版本的Matlab中工作良好)。我曾多次与技术支持人员联系,并向他们提供了演示内存泄漏的简单代码版本。金宝app技术支持告金宝app诉我,他们认为问题出在findjobj,但由于这是第三方代码,他们不会支持它。我对这个答案很不满意,并继续推搡,但到目前为止没有运气。
函数h = transparentUIcontrol(varargin)
创建一个背景透明的uicontrol
H = uicontrol(varargin{:});
jLabel = findjobj(h);
jLabel.setOpaque(假);
如果isfield (jLabel, BorderPainted)
jLabel。BorderPainted = false;
结束
jLabel.repaint ();
结束
谢谢你这么做——它适用于2019a。(版本1.47有错误)。
关于我之前的帖子,我找到了一个变通办法:
1.创建一个“虚拟”的数字,在那里父母的适用性
2.抓取它的Java句柄并将它们存储在一个属性中
3.将可使用的父元素改为TabPanel
4.删除假人
我仍然不能理解为什么这个工具不能工作,如果在适用的养育树中有一个“TabPanel”,尽管…
我正在寻找Java句柄下面的一个适合。它一直工作正常,直到我添加了一个GUI布局工具箱的组件,特别是“TabPanel”。它现在是我的uitable: findjobj的爷爷奶奶奶奶(…)父母之一,再也不能得到我的Java句柄了。我还尝试给findjobj我的uitable的祖先数字作为输入,使用选项“class”(findjobj(figureAncestor, '-nomenu', 'class', 'UITablePeer'),但什么都没有发生。我发现,如果我从我的uitable的每个祖父母中获得属性“JavaFrame”,我得到的唯一非空结果是当我询问“TabPanel”对象时(这是有意义的!):我想知道这是否与工具的错误功能有关……
@Yair -你说得对。如果不是可选的GUI句柄,我使用的图形和搜索'类'参数,然后它工作:
jHandle = findjobj(h,'类','JTabbedPane')
...虽然比较慢…幸运的是,添加' nommenu '参数后,速度是固定的。
jHandle = findjobj(h,'class','JTabbedPane','nomenu')
非常感谢!
@Mariano - findjobj使用像素位置和大小来查找底层Java对象,这可能会随着显示分辨率的变化而变化。相反,您可以尝试使用'class'参数来搜索对象,这应该与分辨率无关。
神奇的工具!
只是一个奇怪的问题,我遇到了以下代码(Matlab 2018b):
H =数字;
Tabgroup = uitabgroup(h);
tab1 = uitab(tabgroup, 'Title','tab1');
tab2 = uitab(tabgroup, 'Title','tab2');
jHandle = findjobj(tabgroup,'class','JTabbedPane')
如果我在Windows(7和10)中设置屏幕显示设置为125%大小,那么我得到:
jHandle =
1x0空手柄
但是如果我将屏幕显示设置为100%大小,那么没问题……我得到了我所期望的:
jHandle =
javahandle_withcallbacks.com.mathworks.mwswing.MJTabbedPane
谢谢!
@Eddie -谢谢你的提示,我在刚刚上传的最新版本中加入了你的解决方案。
MathWorks修改了uitables的内部实现,因此findjobj现在只报告表的包装器滚动窗格句柄。你可以通过hScrollpane.getViewport.getView获取可用的对等体。或者,您仍然可以直接获得对等句柄,如果您在它的包含图中搜索它(不是直接通过uitable句柄):父母,“类”、“uitablepeer”)
Findjobj不再找到2018b的uicontrol的java句柄。然而,我找到了解决办法。替换第3399 -行
集(hControl”,工具提示 ','!@#$%^&*');
与
集(hControl TooltipString ','!@#$%^&*');
设置Tooltip属性似乎不再设置其Java容器中的ToolTipText。但是设置TooltipString可以。
你好Mathworks,
findjobj函数对属性“UITablePeer”工作不正常,但对其他属性工作正常,详细信息请参阅下面的代码。
value = findjobj(handles, '- nommenu ', 'class', 'UITablePeer')
函数findjobj为属性“UITablePeer”返回的值不正确。
我们正在使用findjobj的最新版本。M文件和我们在2017b中使用的matlab版本。
它在matlab版本2011b中工作得很好,但在matlab版本2017b中不行。
你能提供解决方案来解决这个问题吗?
谢谢你!
非常感谢,它工作。findjobj ? ?
@Hanzala - findjobj只适用于基于java的窗口(使用GUIDE或figure函数创建)。AppDesigner(和ufigure函数)创建一个java脚本窗口,findjobj不支持,也永远不会支持。金宝app
你好。这个工具如前所述,适用于正常的GUIDE组件,但我一直试图在应用程序设计器应用程序中实现这一点。返回的句柄总是空的。这是否已经与应用程序设计师进行了测试?
优秀的工具
谢谢,这对我很有用。我想移动滚动条的位置,我想自动,我将分享这段代码jScrollpane = findjobj(handles.tagTable_TargetList);
jScroll = jScrollpane.getComponent(0);
scrollMax = jScrollpane.getVerticalScrollBar.getMaximum;
scrollValue = floor(scrollMax * ((row_index-1)/row));
scrollValue jScroll.setViewPosition (java.awt.Point (0));
真的很有用,我用它来绑定右键单击我的sessionmanager项目中的列表视图。
这太棒了!非常有用,既是一个工具,也是一个构建基于树的gui的示例。谢谢分享。
这是期望与ufigure和所有其他相关的appdesigner组件一起工作吗?
在较早的版本中,有与CalinV相同的错误:
错误@ jScrollpopup.getViewport.getView——> "未定义的函数'getViewport'的输入参数类型'handle.handle'。"
在新版本中似乎是固定的,可能是由于新的绘制顺序/延迟。伟大的工作!
非常好的用户界面
与CalinV相同的错误。谢谢你神奇的实用功能!
伟大的功能!我有一个关于改变弹出菜单项的背景和前景色的问题,当鼠标悬停在他们(默认是经典的蓝色)。我该怎么做呢?
我尝试了以下代码行(适用于列表框和表类),但没有成功:
函数popupmenu_Callback(hObject, eventdata, handles)
jScrollpopup = findjobj(hObject);
jPopupmenu = jScrollpopup.getViewport.getView;
jPopupmenu.setSelectionBackground (java.awt.Color (1, 0.6, 0));
jPopupmenu.setSelectionForeground (java.awt.Color (0, 0, 0));
jPopupmenu.setSelectionAppearanceReflectsFocus (0);
错误@ jScrollpopup.getViewport.getView——> "未定义的函数'getViewport'的输入参数类型'handle.handle'。"
我非常希望Matlab能够公开UI对象的java句柄,以便进行高级编程。那我们就不需要这么复杂的把戏了。在此之前,这是一个伟大的工具!
神奇的效用。在以前的版本中,我使用以下代码将表的第一列单元格(行名)的宽度更改为100像素
jTable = findjobj(handles.MyTable)
rowHeaderViewport = jTable.getComponent(4)
rowHeader = rowHeaderViewport.getComponent(0);
rowHeaderViewport.setPreferredSize (java.awt.Dimension (100,0));% 100 =宽度,单位为像素
height = rowHeader。获得;
高度rowHeader.setPreferredSize (java.awt.Dimension (100));
rowHeader。setSize(100, height);
在新版本中,这将在第三行返回一个错误:
出现Java异常:
java.lang.ArrayIndexOutOfBoundsException:没有这样的子:0
在java.awt.Container。getComponent(未知来源)
我发现了两个原因,为什么最新版本比以前慢得多。它们都在findjobj_fast中:
1) pause(0.001)非常不准确,实际上在我的机器上暂停了0.01秒或更长时间。这是暂停的一个已知问题。
2)在findTooltipIn中,getToolTipText方法需要很长时间,特别是因为它被调用了100次,直到代码切换到遗留方法。
两次它都不能通过快速方法找到一个对象,我的代码在这里浪费了14秒(为了检查6个ui元素)。
我的快速解决方法是将计数器减少到10(第3390行),暂停减少到0.01(第3395行)。解决办法可能是重新考虑方法,或者尽早确定快速方法什么也找不到。
我经常使用finjobj,这是一个很棒的工具。但不幸的是,我不得不恢复到版本2014-01-04,因为每个最新版本都会破坏我的代码:
2016-04-11版本:我的一些工具提示被'!@ # $ % ^ & *’
2016-04-14版本:命令行错误
2016-04-19版本:修复了前两个版本的工具提示和错误,但需要大约两倍的时间来执行(8秒而不是4秒执行我的GUI初始化代码)
顺便说一下,我用的是R2011b。
这是我们一直用于交互式映射GUI的一个很棒的函数。我们很高兴有一个快速更新。虽然它在使用新版本的MatLab时确实有所改善,但我们的GUI在MatLab 2012中打开的时间大约是我们许多用户的10倍(比2014b更快的地图图形)。
使用分析器,我追踪到findTooltipIn在每次调用findjobj时被调用1100次。jControl始终为空,因此while循环在findjobj_fast中执行100次。一旦在findTooltipIn中,它调用自己54次(在我们的应用程序中),都是零调用。然后由于jControl仍然是空的,它执行旧的逻辑。我已经在我们的代码中解决了这个问题,只是在走这条路之前添加了一个版本测试。
谢谢
谢谢后!最新的更新工作得很好
@MikeLab -我刚刚上传了一个新版本,应该可以修复你在R2013a(或任何其他比R2014b更老的Matlab版本)上看到的问题
这非常有用!
有没有办法访问旧版本的findjobj?
目前的版本在Matlab 2015a中工作得很好,但在使用Matlab 2013a的pc上,我得到了一个错误。
这里有一个例子:
函数GetJTableTest
F =数字;
数据= rand(3);
colnames = {'X-Data', 'Y-Data', 'Z-Data'};
t = uitable(f, 'Data', Data, 'ColumnName', colnames,…
'Position', [20 20 460 350]);
Jscroll = findjobj(t);
结束
-----------
命令行输出:
> > GetUITable
findjobj:右边的元素数量与左边需要的元素数量不匹配
一边
findjobj中的错误(第278行)
handles (dataLen+1:end) = [];
GetUITable中的错误(第8行)
Jscroll = findjobj(t);
410年重新抛出(错);
--------------
附加信息:变量handles的作用域跨越多个函数。
我一直在用它。爱它!
非常感谢更新!明显更快。我在使用findjobj的函数中看到了x4的改进。
然而,这并不是简单地删除和放置新的findjobj。我将该组件的父图设置为不可见,但是findjobj不会找到所有的组件。之前的findjobj能够做到。
我能够通过将图形移出屏幕并让findjobj找到组件并将其移回屏幕来解决这个问题。
嗨,实验后,
我认为拥有25个ui控件的GUI应用程序在速度上并没有太大的提升。
此外,我的工具提示字符串一直显示奇怪的字符。
马可
嗨Yair, findjobj函数做得很好!在我们的gui中使用它,效果很好。我的一个同事更新到Matlab R2015b和Windows 10。现在findjobj不从uitable返回任何东西。
我认为这可能与新的Matlab版本有关,所以我在我的windows 7机器上尝试了它,我从R2015b中对一个uitable的简单调用中得到了以下内容:
>> hTable =适合;
>> jScroll = findjobj(hTable)
jScroll =
javahandle_withcallbacks.com.mathworks.hg.peer.utils.UIScrollPane
在windows 10的机器上,我得到:
>> hTable =适合;
>> jScroll = findjobj(hTable)
jScroll =
处理:1-by-0
java对象未恢复…
你认为这和操作系统有关吗?Matlab处理java对象的方式在Windows 7和Windows 10之间有什么不同吗?
提前谢谢你,
查尔斯
优秀的实用程序。FWIW我在GUIDE gui中遇到了一些问题,我在打开函数中多次调用findjobj,因为它导致gui失去键盘焦点。这是通过在OutputFcn中调用x = findjobj(gcf)来解决的。不需要使用'x',只需将findjobj指向gcf即可。
感谢Yair为更好的Matlab而奋斗:-)
我遇到了findjobj的一个问题,这使得它很难使用。
Findjobj不会在非活动选项卡中查找对象。有解决办法吗?现在,我在绘制选项卡之前选择它们,但这并不是真正的故障保险。
非常感谢,
托拜厄斯
@Yair -我在检查根对象时发现了一个小bug:
> > findjobj(大的)
findjobj:从matlab.ui.Root转换到handle.handle时发生以下错误:
要处理的转换。处理from matlab.ui.Root is not possible
findjobj/traverseContainer中的错误(第505行)
handles(thisIdx) = handle(jcontainer,'callbackproperties');
findjobj中的错误(第259行)
traverseContainer(容器,0,1);
奇怪的是,当尝试“老派”方法时,它并没有错:
> > findjobj (0)
ans =
处理:1 -到- 1144
主节点是主桌面框架“com.mathworks.mde. Desktop . mlmainframe”。
除此之外,FindJObj是一个非常有用的实用工具。再接再厉!
啊哈-我不知道我可以使用清除命令来重置持久变量-谢谢你提供的信息。
@Gary -我认为你的解决方案不太好:findjobj在检测到与前一个容器不同的容器时已经清除了持久句柄。
如果你已经知道容器的内容(而不是它的句柄)已经改变了,你所需要做的就是在那一点上调用clear('findjobj')来清除持久句柄。对findjobj的后续调用将看到已清除的持久变量,并将重新计算它们。
如果你喜欢findjobj,请给它打分。
Yair -非常感谢你的修复。我想再提一个建议。对我来说,使用“persist”是很有价值的,但当我知道容器已经更改了内容时,就会删除持久化目录。我通过在第170行左右的“if isempty(container)”之后添加“pContainer =[];”来处理这个问题;我不确定这是否会扰乱其他用户,或者如果你想要一个特定的参数值,将删除容器。
——加里
@David & @Gary——FindJObj的最新版本解决了这个问题,并区分了重叠控件,而不必使用David建议的解决方法。
嗨,保罗,
我已经为您的问题找到了一个解决方案,但它并不理想,因为它需要运行findjobj两次来重新扫描所有对象。
% findjobj测试脚本
hWnd =图;
tgrp = uitabgroup('Parent',hWnd);
tab1 = uitab('Parent',tgrp,'Title','tab1');
tab2 = uitab('Parent',tgrp,'Title','tab2');
t1 =场上(“父”,tab1);
a1 = findjobj (t1)
集(findjobj (t1,“财产”,{‘名’,”})、“名”、“uitable1”)
% %
t2 =场上(“父”,tab2);
% %
集(findjobj (t2,‘坚持’,‘属性’,{‘名’,”})、“名”、“uitable2”)
= findjobj (t1,‘-nomenu’,‘属性’,{‘名’,‘uitable1},“财产”,{‘UIClassID’,‘ScrollPaneUI});
b = findjobj (t2,‘-nomenu’,‘属性’,{‘名’,‘uitable2},“财产”,{‘UIClassID’,‘ScrollPaneUI});
你好Yair -我的代码片段取代了我之前的注释。“混叠”问题是findjobj无法区分两个不同选项卡中位于相同位置的两个不同的表。
谢谢!
下面是演示混叠问题的测试代码:
% findjobj测试脚本
hWnd =图;
tgrp = uitabgroup('Parent',hWnd);
tab1 = uitab('Parent',tgrp,'Title','tab1');
tab2 = uitab('Parent',tgrp,'Title','tab2');
t1 =场上(“父”,tab1);
一个= findjobj (t1),
% %
t2 =场上(“父”,tab2);
% %
一个= findjobj (t1),
b = findjobj (t2),
一个= = b,
直到至少显示一次,Matlab才实际呈现Java组件。在此之前,findjobj将返回空。
在R2014b中,整个底层图形渲染引擎已经改变了(所谓的HG2),所以在14a中工作良好的东西需要在14b中进行调整也就不足为奇了。事实上,我发现findjobj在14b中[大部分时间]仍然很好,这是个小奇迹……在您的情况下,您可以简单地以编程方式激活选项卡,并调用drawnow(),这应该可以解决您的问题。
我有一个类似于Sneha的错误,当在2014a工作的findjobj调用在2014b返回空结果时出现。
在我的情况下,我从GUILayoutToolbox在TabPanel上创建了一个uitable。Findjobj在创建后无法找到合适的对象。它能够找到它后,我改变了活动选项卡,是包含的uitable。
不确定这是否有帮助-或者为什么findjobj不能在选项卡激活之前找到对象。
在2014b版本中,我也得到了使用此函数的错误。类handle.handle没有适当的方法、属性或字段getViewport。
Zoé -下载最新版本,在R2014b上应该可以正常工作。
不幸的是,findjobj在R2014b中似乎不起作用:
findjobj:使用javahandle.com.mathworks.hg.peer.UITreePeer/set时出错
的名称'NodeExpandedCallback'不是一个可访问的属性
类实例'com.mathworks.hg.peer.UITreePeer'。
findjobj/ presenttobjecttree错误(第1524行)
set(tree_hh, 'NodeExpandedCallback', {@nodeExpanded, tree_h});
findjobj中的错误(第303行)
presentObjectTree ();
亲爱的实验后,
当我运行.m文件时,代码似乎并不总是工作。我构建了一个带有按钮和编辑框的GUI。如果我按下按钮,我可以选择数据,如.txt和.csv文件,并在编辑框中写入前20行。然而,有时,当加载相同的文件时(当我加载它们时,我得到的也是相同的,所以它不应该是我的数据加载函数),有一个水平滚动条,有时没有。下面是我在GUI打开函数中写的:
jScrollPane = findjobj(handles.edit1);
集(jScrollPane VerticalScrollBarPolicy的20);jScrollPane.setHorizontalScrollBarPolicy (30);
jViewPort = jScrollPane.getViewport;
jEditbox = jViewPort.getComponent(0);
jEditbox.setWrapping(假);
你知道吗?是bug还是我的问题(更可能是XD)
谢谢,
凯瑟琳
我使用findjobj在多个按钮上添加图标,并使用Progressbar…但when i run the Gui, it open and close ( flasjing)at each "findobject" call.
然后工作正常…知道发生了什么吗?
jButton = java(findjobj(处理。应用,' nomenu '));
myIcon = fullfile(currentDir,'/icons/apply.png');
jButton.setIcon (javax.swing.ImageIcon (myIcon));
jButton.setBorder (raisedetched);
迈克尔
如何把matlab放在类固醇!对GUI有更多的控制非常有用。
非常有用,非常酷
Sebastian——也许嵌套面板导致mtable的上报像素位置与jtable略有不同,导致在预期的位置/大小上找不到jtable。这不会让我感到惊讶,因为每个uipanel在每一侧都有1-2个像素的边框,所以你嵌套的uipanel越多,位置不匹配的概率就越大。
亲爱的Yair;
很抱歉造成了混乱-我的评论似乎没有正确发布。
我在很多场合使用过你优秀的findobj,但今天发现了一个奇怪的行为。当在每个面板中嵌套许多面板时,findjobj似乎无法找到底层的java表句柄。举个简单的例子:
subpanel1 = uipanel('Parent', gcf, 'units','normalized','Position',[0 0 1 1]);
subpanel2 = uipanel('Parent', subpanel1, 'units','normalized','Position',[0 0 1 1]);
subpanel3 = uipanel('Parent', subpanel2, 'units','normalized','Position',[0 0 1 1]);
subpanel4 = uipanel('Parent', subpanel3, 'units','normalized','Position',[0 0 1 1]);
%正常工作
subpanel3 mTable =场上(“父”,“单位”,“归一化”,…
'Position',[0.02 0.14 0.96 0.84]);
jHandle = findjobj(mTable)
这不起作用- findjobj返回空
subpanel4 mTable2 =场上(“父”,“单位”,“归一化”,…
'Position',[0.02 0.14 0.96 0.84]);
jHandle2 = findjobj(mTable2)
任何想法吗?
致以最亲切的问候
塞巴斯蒂安。
亲爱的Yair;
补充我之前的评论,我注意到findjobj(gcf,'class','uitable')在后面的情况下也能正确地找到句柄。在我的情况下,这个问题是,我在GUI中有几个表,这返回所有表的向量,我没有办法区分这些提取我想要的特定的一个。
致以最亲切的问候
塞巴斯蒂安。
Yair -我发现了一个需要解决的问题:
如果在使用“persist”选项调用findjobj之后,主GUI窗口被移动,那么后续对findjobj的调用将无法返回对象句柄。这是因为容器(或pContainer)是持久变量之一,而processpotionargs函数使用容器。getX和容器。getY来过滤java对象。
更糟糕的是,后续不带"persist"参数的findjobj调用不会禁用持久性。我阅读代码的方式,迫使findjobj重新计算所有位置的唯一方法是首先在一个单独的图形上调用它,并使用“persist”参数,然后在不使用“persist”参数的所需图形上调用它。(我还没有测试过,所以我可能是错的)。我认为这可以很容易地修复,只需在第237行左右修改一些代码。
不过,完整的修复会稍微复杂一些。
看起来其他人(比如Kesh Ikuma)也有类似的问题。我给这个很棒的工具打了4分。如果“persist”选项可以在图形移动或调整大小时重置,则这将是一个5。
Yair -你觉得添加一个“repersist”(或者任何你认为最能描述这个特性的名字)来重新扫描容器以更新持久数据怎么样?
我在构建GUI时多次调用findjobj(…,'persist')时遇到了一个问题。我将第240行修改为
"if isequal(pContainer,container) && ~paramSupplied(varargin,'persist')"
暂时,但希望有一个官方的功能来解释这种情况。
谢谢,Kesh
@Dan -也许,测试应该足够简单
实验后,
感谢您的反馈....如果我解开这个人物,找到这个物体,然后重新停靠,它会起作用吗?或者重新对接人物的行为会改变把手吗?
@Dan K -这是正确的:findjobj不适用于停靠图,因为在这种情况下Java组件的层次结构完全不同——停靠图只是Desktop窗口中的一个内部面板,而不是像未停靠的情况下那样是一个独立的Frame/窗口。
也许有一天我会上传一个修复程序,但我不希望它在近期内出现。
实验后,
谢谢你这么实用。我注意到一件事。它对停靠的数字不起作用。如果我使用:
hButton = uicontrol('string','click me');
jButton = findjobj(hButton,'nomenu');
在未停靠的图形上,它会找到句柄,但如果停靠图形,它会返回一个空矩阵。想法吗?
谢谢Yair!
通过使用这个函数,我能够解决我正在编写的一些代码中的问题,这已经困扰了我好几天了!
@Satwik -你可以告诉findjobj通过职位和/或类来搜索,而不仅仅是大小-阅读findjobj帮助。
根据我的经验,在不同的系统上,位置有时会改变几个像素,但大小保持不变-你发现大小变化很奇怪。
首先,感谢所有优秀的投稿。它们极大地扩展了MATLAB gui的实用性。
我在使用findjobj时遇到了一个奇怪的问题,它起源于上游,但源于findjobj按位置查找元素。
在一个同事创建的GUI上,findjobj在windows机器上工作得很好,但在linux上断断续续地失败。
我将此追溯到这样一个事实,即在linux中检测到的大小似乎有时会发生变化,尽管这些在gui中是硬编码的。例如,getRootPanel中contentSize的高度组件发生了变化,这导致高度的baseDeltas超出了可接受的范围。
我知道这可能不是findjobj的问题,但我想知道您以前是否遇到过这个问题和/或可以提供一些关于如何确保可靠地检测gui大小的建议。
好的,谢谢,就这样。
如果我改变任何uicontrol的(编辑框)属性后,我已经改变了它的指针(我已经做了一个日历的日子是编辑框,我希望它的悬停指针设置为默认箭头,而不是|),它似乎故障setCursor。
我想知道的是,如果uicontrol的属性不断被改变,把setCursor属性重置为默认值,或者我只需要改变一次。
综上所述,我想要的是改变日历的编辑框的天数指针到默认箭头。
谢谢你!
在调用findjobj时,该按钮可能不可见。它必须是可见的才能工作
首先,感谢你们的贡献。我读过你很多书。
我不能让fidjobj在R2012b上工作,它总是返回给我[]
如。
>> hButton = uicontrol('string', 'Hello');
jButton = findjobj(hButton);
jButton
jButton =
[]
更新:
现在起作用了。我不得不在b = findjobj(handle2)后重新设置回调函数。
对findjobj的第二次调用似乎使对象a的回调失效。
谢谢你的帮助。
没有真正的理由说它不应该起作用。也许在调用findjobj()时其中一个表是不可见的。在两行上都放置一个断点,以检查情况是否属实。
谢谢你的回答。我不是指向量化。
我有使用问题
A = findjobj(handle1)
B = findjobj(handle2)
这两个调用都是从不同的函数中进行的,handle1和handle2是同一个GUI中的不同表。call_1 XOR call_2工作正常。有什么建议吗?
@ismirbrille - findjobj一次只在单个组件上工作,它不是向量化的。要获得多个Matlab控件的底层Java对象,需要为每个控件分别调用findjobj。
@Yair Altman -谢谢你的代码,非常有用,干得好!
您目前工作的版本是否支持多个容器对象?金宝app
我必须同时使用2个具有java功能的表。
遗憾的是,Matlab不支持现代GUI开发。金宝app
感谢你克服局限性所做的伟大工作!
好的,谢谢!!!!实验后奥特曼
Java定制不会保存在FIG文件中。请看这里的讨论和解决方案:http://undocumentedmatlab.com/blog/figure-toolbar-components/#comment-13897
用于创建gui的非常有用的工具箱。我不知道这是否是一个限制(Matlab R2012a)。例子:
h =图(“菜单条”,“没有”,“工具栏”,“没有”,“标签”,“图”);
STR = ' je suis vraiment le + beau de la planete terrrer de la foucv oeufe fz ozfz efz fvousf zefzf ouvzfz ozfz fouz fz fzo ufzf zouz fozufozf uzo fzoufzo fuziofz fzofiuzfoiz fouzfo ';
hEdit = uicontrol(“父”,h,“风格”,“编辑”,“字形大小”,9日……
“敏”,0,“马克斯”,2,‘HorizontalAlignment’,‘左’,……
“单位”,“归一化”,“位置”,[0 0 11 1],…
“字符串”,str,‘标签’,‘hEdit’);
%#启用水平滚动
jEdit = findjobj(hEdit);
jEditbox = jEdit.getViewport().getComponent(0);
jEditbox.setWrapping(假);%#关闭换行
jEditbox.setEditable(假);% #不可编辑
集(jEdit的HorizontalScrollBarPolicy 30);% # HORIZONTAL_SCROLLBAR_AS_NEEDED
%#保持水平滚动条策略,该策略在组件调整大小时返回
hjEdit = handle(jEdit,'CallbackProperties');
集(hjEdit, ComponentResizedCallback”、“集(gcbo“HorizontalScrollBarPolicy”30)”)
saveas (h,“测试”,“图”);
没有问题,如果你直接运行脚本(水平+垂直滚动条可用)。但是如果你启动保存的文件:'test。图中,水平滚动条变得不可用。
谢谢
非常有用的功能,帮助我很多。就太好了!
谢谢支持!金宝app
我用findjobj来更新一个表的位置,它工作得很好,但是有一些渲染工件作为更新的结果-希望在这里看到:http://imgur.com/uJYps3Y.
抱歉,因为我不太熟悉java,但一个简单的画现在似乎没有帮助。
控件必须是可见的,findjobj才能工作。可以使用命令使图形在OpenFcn中可见
集(hObject,“可见”,“上”);drawnow;
如果您不希望图形实际出现在屏幕上,您可以将其位置设置为[-300,-300,200,200]或其他屏幕外位置。这个人物将变得可见,但隐藏起来……稍后您可以将它移动到OutputFcn中的屏幕中心。
您好,祝贺您编写了如此出色的代码!
我的问题是:
在uicontrol被正确渲染之前,我需要使用findjobj。
有办法实现这个目标吗?
(我需要在GUI的OpenFcn函数中设置uicotnrol的一些属性。)这意味着ui控件还没有被渲染。
@Echidna - findjobj工作开箱即用,不需要任何额外的安装或文件,包括在部署(编译)应用程序。所以我99.99%确定问题出在你的代码中。这可能是由于以下几种可能性之一:
1)也许在调用findjobj之前,你的编辑框还没有在屏幕上显示足够长的时间。Findjobj在找到其底层Java组件之前必须使控件可见。在调用findjobj之前调用pause(0.1)和drawnow,以确保确实如此。
2)也许你的回调函数因为某种原因失效了。例如,如果您将编辑框从多行修改为单行或其他类似的更改,则底层Java控件可能已经更改,从而迫使您重新设置回调
3)也许你的更新回调正在被调用,但由于某种原因在更新列表框时遇到了bug。在回调中放置调试打印输出以检查这一点。
当我直接在Matlab中运行我的GUI时,这段代码工作得很好,但是当我使用部署工具将它编译成可执行文件时,它并不总是工作。更具体地说,它工作的第一次我改变编辑框中的文本,有时是第二次,但之后的某个地方(总是在不同的点),它似乎不再工作(即没有更新我的列表框,当我在编辑字段和一些其他奇怪的东西有时会发生冻结的列表框,没有找到文本字符串,即使我知道它在那里)。
这是一个已知的错误,我如何解决这个问题?除了findjobj,我还需要在“共享资源和帮助文件”部分中包括其他文件吗?m文件,当然我已经包括了?
@Peter -据我所知,最新的findjobj在R2012b上正确工作。试着在一个新的图形中运行你的两行,自己看看。也许在您的特定GUI中,findjobj由于某种原因无法找到滑块控件。一种可能的解释是,在运行findjobj时,uicontrol没有完全呈现(显示)。在这种情况下,放置短暂的暂停(0.05)和drawnow()可能会有所帮助。还要确保滑块实际显示在屏幕上(Visible=on,有效的位置和值)。
我已经成功使用这个模块很多年了,谢谢。
对于R2012b,我有一些问题:
Jh = findjobj(滑块,' nommenu ');
jh。AdjustmentValueChangedCallback = @(src,event)sliderCallbackFunc(src);
而第二行会导致一个错误
点名称赋值中右侧元素数量不正确。左边缺少[]是a
可能的原因。
其他人在R2012b下也有相关问题。
@Changshun Deng -我相信我昨天上传的FindJObj的最新版本解决了这个问题
嗨,我运行这个程序findjobj(jEditor)作为http://undocumentedmatlab.com/blog/accessing-the-matlab-editor/
我找不到编辑器的对象。
错误:??findjobj:在javax.swing中没有'UserData'属性。JTable 1美元的类。
我的matlab版本是:matlab version 7.4
@Ward -谢谢-我相信你可能是对的。除非在过滤过程中有几个重叠/相似的结果,否则这是没有效果的,这种情况非常罕见。但在这种罕见的情况下,您的修复将解决同时返回父句柄和子句柄的问题。
在第646-649行,如果在原始句柄中,第一个句柄是第二个句柄的父句柄,则丢弃第一个句柄。这是正确的Args处理后,还是应该第一行
if length(foundIdx) > 1 && isequal(handles(foundIdx(1)).java, handles(foundIdx(2)).getParent)
这是一个非常酷的工具,但是我遇到了Michael遇到的同样的问题——如果我编译代码,我会得到大量“文件为空”的消息。一切都很好,它只是妨碍了我想用输出窗口做的其他事情。有什么进展可以解决这个问题吗?
@HaveF -当你指定一个输入句柄(如hButton)时,你不需要使用“nomenu”参数。
我无法复制你报告的任何问题。也许可以尝试下载最新版本的实用程序。
尝试在调用findjobj之前添加一个调用drawnow和/或pause(0.1)。另外,确保控件实际上是可见的(findjobj只能检测可见的组件)。
好像丢了什么东西……
当我尝试findjobj时,我的机器上出现了一些奇怪的东西。
>> hButton = uicontrol('string','点击我');jButton = findjobj('property',{'Text','click me'});
一切如我所料。
但
>> hButton = uicontrol('string','点击我');jButton = findjobj(hButton,'nomenu')
只需返回*ans = <1x0>*
还有一件事,我是你的一大笑料。
我以前使用setPrompt,但是当我尝试findjobj时,提示符消失了。
就像这样:
[18:57:11] temp_proj > >
[18:57:11] temp_proj > >
[18:57:11]temp_proj>> hButton = uicontrol('string','click me');
[18:57:16]temp_proj>> jButton = findjobj('property',{'Text','点击我'});
>>
还有一件事,我是你的一大笑料。
我以前使用setPrompt,但是当我尝试findjobj时,提示符消失了。
就像这样:
[18:57:11] temp_proj > >
[18:57:11] temp_proj > >
[18:57:11]temp_proj>> hButton = uicontrol('string','click me');
[18:57:16]temp_proj>> jButton = findjobj('property',{'Text','点击我'});
>>
太好了!
上面的代码工作-经常;)
有时它会抛出:
类handle.handle没有适当的方法、属性或字段getViewport。
->类句柄。Handle =>哈哈
如何确保findjobj找到了表?
目前我重试失败:
代码:
函数setTableSelectedCellColor(表)
%
试一试
jUIScrollPane = findjobj(表,' nommenu ');
jUITable = jUIScrollPane.getViewport.getView;
jUITable.setSelectionBackground (java.awt.Color (1 1 1));
jUITable.setSelectionForeground (java.awt.Color (0, 0, 0));
抓
setTableSelectedCellColor(表);
结束
结束%功能
最终的代码
令人难以置信的!
对于白色背景的表格,我使用它来避免选择引起的颜色变化:
代码:
创建表
表=合适的(…
“父”,布局,…
'ColumnWidth',{100, 150},…
'ColumnName', {tableTitle},…
'RowName',[],…
'ColumnFormat', {'char', selectionList},…
'ColumnEditable', [false, true],…
“数据”,tableData,…
CellEditCallback, @selectionChanged);
%工作区,以避免选择引起的颜色变化
jUIScrollPane = findjobj(表);
jUITable = jUIScrollPane.getViewport.getView;
jUITable.setSelectionBackground (java.awt.Color (1 1 1));
jUITable.setSelectionForeground (java.awt.Color (0, 0, 0));
最终的代码
是否有办法使findjobj命令更快?
@Evzen -出于某种原因,你得到了一个可选工具的句柄而不是编辑框,当然你不能为可选工具设置页面URL…
也许你的工具与编辑框的像素位置相同?
尝试在findjobj调用之后的行上放置一个断点,以确定它找到了哪个对象。
关于设置富编辑框内容的更多信息可以在这里找到:http://undocumentedmatlab.com/blog/rich-matlab-editbox-contents/
人吃惊效用。谢谢分享,但我有一个小问题,我没有解决它。我使用一个代码从你的网页,但它给我这个错误与方法setPage:
类没有适当的方法、属性或字段setPage
com.mathworks.hg.peer.ui.UITablePeer 22美元。
hEditbox = uicontrol('style','edit', 'max',5);
jScrollPane = findjobj(hEditbox);
jViewPort = jScrollPane.getViewport;
jEditbox = jViewPort.getComponent(0);
jEditbox.setPage ('http://www.google.com');
@Sean -你不需要findjobj来访问特定的工具栏按钮-你可以使用内置的findall函数,如下所述:http://undocumentedmatlab.com/blog/modifying-default-toolbar-menubar-actions/
这是一个很棒的工具。谢谢你分享你的作品Yair。
我试图使用findjobj获取工具栏uitogglebutton的java句柄。它找不到按钮的句柄。当我像这样调用函数时:
findjobj;
它找到工具栏按钮。为什么是这样,有一种方法我可以修改findjobj直接找到工具栏按钮?
超级工作!然而,当我编译这一行时:
jScrollPane = findjobj(handles.editBox)
当我执行代码时,我多次在命令行中得到“文件为空”的消息。不管怎样,代码还是可以工作的!?什么好主意吗?
最好的问候!
PS:我使用您的工具从编辑框中提取选定的文本。
终于让它工作了,非常感谢你的更新!
嗨,伙计们,
我在_OpeningFcn中编写了以下代码(因为我使用了GUIDE!)
暂停(0.01);
drawnow;
jb = findjobj(“类”、“按钮”);
drawnow;
set(jb(2), 'MousePressedCallback', @UpVertTest);
guidata (hObject处理);
--------------------
到这里一切正常,
但是在我的m文件的末尾,我定义了相关的函数(UpVertTest),我有问题,
我想要访问正常的句柄并做一些更改,但我得到这个错误:
???未定义的函数或方法'toDouble'用于类型为'java.awt.Dimension'的输入参数。
错误在==>不透明。80岁翻倍
dbl = toDouble(opaque_array(1));
在==> guidata 85错误
If isscalar(h) && ishhandle (h)
错误==> RatRobot_GUI4>UpVertTest at 523
handlesData = guidata (src);
这是我所写的代码:
函数UpVertTest(src, evnt)
%试图访问句柄
handlesData = guidata (src);
%在GUI中设置新的初始值
集(handlesData.VerticalPosStart,“字符串”,handlesData.initZ-handles.Step (3)); drawnow;
-----------
我觉得我的函数定义有问题,
什么好主意吗?
我使用了findjobj-函数,如本文所述http://undocumentedmatlab.com/blog/customizing-listbox-editbox-scrollbars/以禁用文本换行并在GUI编辑框中显示水平滚动条。
非常感谢这个神奇的工具。这招很管用。
经过进一步的测试,在使用findjobj之后,我不时地得到以下错误:
线程“AWT-EventQueue-0”中的异常
javax.swing.text.BoxView.calculateMinorAxisRequirements (BoxView.java: 886)
javax.swing.text.html.BlockView.calculateMinorAxisRequirements (BlockView.java: 129)
javax.swing.text.BoxView.checkRequests (BoxView.java: 918)
javax.swing.text.BoxView.getPreferredSpan (BoxView.java: 528)
javax.swing.text.html.BlockView.getPreferredSpan (BlockView.java: 345)
javax.swing.plaf.basic.BasicTextUI RootView.getPreferredSpan美元(BasicTextUI.java: 1342)
javax.swing.plaf.basic.BasicTextUI.getPreferredSize (BasicTextUI.java: 908)
javax.swing.JComponent.getPreferredSize (JComponent.java: 1622)
javax.swing.JEditorPane.getPreferredSize (JEditorPane.java: 1412)
com.mathworks.hg.peer.EditTextPeer hgTextEditMultiline.getPreferredSize美元(EditTextPeer.java: 864)
javax.swing.ScrollPaneLayout.layoutContainer (ScrollPaneLayout.java: 769)
java.awt.Container.layout (Container.java: 1421)
java.awt.Container.doLayout (Container.java: 1410)
java.awt.Container.validateTree (Container.java: 1507)
java.awt.Container.validate (Container.java: 1480)
javax.swing.RepaintManager.validateInvalidComponents (RepaintManager.java: 670)
javax.swing.SystemEventQueueUtilities ComponentWorkRequest.run美元(SystemEventQueueUtilities.java: 124)
java.awt.event.InvocationEvent.dispatch (InvocationEvent.java: 209)
java.awt.EventQueue.dispatchEvent (EventQueue.java: 633)
java.awt.EventDispatchThread.pumpOneEventForFilters (EventDispatchThread.java: 296)
java.awt.EventDispatchThread.pumpEventsForFilter (EventDispatchThread.java: 211)
java.awt.EventDispatchThread.pumpEventsForHierarchy (EventDispatchThread.java: 201)
java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java: 196)
java.awt.EventDispatchThread.pumpEvents (EventDispatchThread.java: 188)
java.awt.EventDispatchThread.run (EventDispatchThread.java: 122)
有解决办法吗?
这是有道理的。谢谢你的澄清。
Jveer - FindJObj *不能在guide创建的*_OpeningFcn中工作,因为此时图形还不可见,因此Java组件还没有呈现,因此无法找到。
尝试在图形变得可见并且所有控件完成呈现之后调用FindJObj *,例如将FindJObj调用移动到*_OutputFcn函数,最好是在调用drawnow之后,以确保所有内容都已完成呈现。
很遗憾,它还是不能用。今天下载,在r2009b和r2010a上试用。令人沮丧的是,它有时有效,有时无效。
1)运行从一个脚本-它工作
2)运行从打开功能的GUI创建使用指南-不工作
3)在#2失败后运行#1的脚本-它不起作用!
4)重新打开matlab并运行#1 - works
很奇怪。
Patrick, Emad和Jayveer -我昨天上传了一个新版本的FindJObj,修复了你们报告的问题。
供您参考,这个问题的发生是由于Matlab图形窗口的Java层次结构的实现略有不同。新的代码应该可以在所有旧的Matlab 7版本*除*到R2010a上工作。
一如既往,我非常致力于在即将发布的Matlab版本中,尽我所能修复这些实用程序。
r2010a findjobj返回[] !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
这使得下面的教程毫无用处!!-http://undocumentedmatlab.com/blog/rich-matlab-editbox-contents/#EditorKit以及网站上的所有其他内容,因为它们都依赖于finjobj!
我和帕特里克有同样的问题。
我用GUIDE制作了一个滑块;它的句柄是hSlider。
我调用jSlider = findjobj(hSlider);
我用MATLAB 2007b试过,效果很好,谢谢。
然后我尝试用MATLAB 2009a, findjobj返回空!
实际上,使用任何参数调用findjobj都返回空。
我做错了什么?
亲爱的Malcolm——谢谢你的反馈。
ApplicationData是一个隐藏属性,FindJObj使用的属性检查器不会显示它。
要查看此信息,只需在FindJObj层次结构树中选择相关对象并单击“Inspect object”按钮。这将打开UIInspect实用程序,它在UIInspect的右下角(“其他属性”)表中显示ApplicationData(如果可用)。
如果您需要更多的控制,您总是可以使用FindJObj的“Export to workspace”按钮,并从导出的对象句柄中获取ApplicationData。
高超的工具Yair。您是否计划提供对对象的应用程序数据区域的访问,例如从左侧面板的上下文菜单?
这简直令人惊讶,你可以深入到Matlab的内部!如果需要在Java应用程序中嵌入matlab,这是非常有用的。Builder JA中应该包含类似的内容
谢谢
伟大的功能。交互式显示是一个很好的特点。
我用GUIDE制作了一个滑块;它的句柄是hSlider。
我调用jSlider = findjobj(hSlider);
我用MATLAB 2007b试过,效果很好,谢谢。
然后我尝试用MATLAB 2009a, findjobj返回空!
实际上,使用任何参数调用findjobj都返回空。
我做错了什么?
为什么我得到这个错误每当我尝试findjobj;
???未定义的函数或变量“jcb”。
我有最新版本的findjobj文件。
我实际上已经解决了我的问题。读完此页后:http://undocumentedmatlab.com/blog/uicontrol-callbacks/,
我试着改变设置回调的方式。在此之前,我直接在java对象上设置回调。然而,当我使用handle()函数然后设置回调时,问题就消失了。
总而言之:
之前:
集(myJavaObject, MouseReleasedCallback @callbackfcn);
现在:
myHandle = handle(myJavaObject,'CallbackProperties');
集(myHandle, MouseReleasedCallback @callbackfcn)
我已经使用这个文件大约一年了(Yair做得很好!),但是当我从R2007b升级到R2008b时,出现了一个非常奇怪的问题。
发生在我身上的是,我有一些自定义java对象实例化(它们是java-swing表的修改版本),用户数据和函数回调通过调用与它们相关联:set(myTableObj,'MouseReleasedCallback',@callbackfcn);
集(myTableObj、用户数据的数据);
在findjobj返回之后,所有的用户数据和回调都已被清除。我一行一行地遍历了findjobj,但没有找到罪魁祸首。事实上,当我到达279的“返回”行时,用户数据和函数回调仍然正确地与java对象相关联。然而,一旦findjobj返回,java对象的所有用户数据和函数回调都将被清除为空矩阵。
对此有什么想法吗?
@Leonardo - FindJObj不支持修改显示的对象层次结构-也许我会在未来的版本中添加这个功能。您需要更新FindJObj外部的层次结构,然后单击<刷新树>按钮。
伟大的文件!我对使用它有一个疑问:如果我可以改变一些结构的顺序。我有一些复选框,使用“tab”来选择它们是完全无序的,使用这个函数我发现它遵循的是树上的特定顺序。
那么,我能改变树中元素的位置吗?
谢谢你的代码
干得好,Yair!我已经在我的空间里提到了它。
只有一个建议:为了与ML的未来版本兼容,应该避免在函数中使用“JavaFrame”。“JavaFrame”是一个com.mathworks.hg.peer.FigurePeer对象,它可以很容易地使用JAVA方法而不是get(hfig,'JavaFrame')来获得。例如,您可以从mde的客户端获取if。
ucd宫殿,
>但是我不明白你是怎么算出来的
下面一行中的> AdjustmentValueChangedCallback属性
我只是使用了findjobj本身:
hSlider = uicontrol('style','slider');
findjobj(hSlider)
丹尼斯
顺便说一句:我有没有提到findjobj非常棒!?
令人敬畏的工具,找到MATLAB对象的底层java对象!工作好了!
伟大的工作!
辉煌!
另一个建议(适用于Matlab 7.5):
如果希望检查Editor-container,则需要更改第175-176行
origContainer =容器;
contentSize =[容器。getWidth container.getHeight);
来
origContainer =容器;
如果比较字符串(container.getName '编辑');
容器= container.getInternalFrame;
结束
contentSize =[容器。getWidth container.getHeight);
塞巴斯蒂安。
MATLAB 7.5的信息。
uitreenode中的不一致。m (%MATLAB%\toolbox\ MATLAB \uitools\uitreenode.m)阻止“findjobj”正常工作。你必须改变“uitreenode”中的第一行。来自……
函数节点= uitreenode(值,字符串,图标,isLeaf)
...……
函数节点= uitreenode(虚拟,值,字符串,图标,isLeaf)
...,然后一切初始化正常。
修复后,它是甜!我花了好几个小时写下对象的层次结构,并开始思考,如果把所有东西都放在“文件”浏览器中该有多好……嗯,你知道的:都在FEX上,…某个地方……
谢谢,
塞巴斯蒂安。
谢谢
ucd puri - jControl和uiComponent是简单的Matlab函数,可以方便地访问和使用Java控件,这些控件通常比基本的Matlab控件更强大。FindJObj函数用于在Matlab图形中查找Java控件的句柄,类似于Matlab的基本findobj函数。
Java控件功能可以在谷歌上搜索(例如,“Java jslider”),或者你可以阅读任何关于Java Swing的好书或在线教程(例如,java.sun.com/docs/books/tutorial/uiswing/components/)。或者,你可以使用我的uiInspect提交的Matlab文件交换,以查看哪些属性/方法/回调可用于任何组件(Java, Matlab或COM) -//www.tatmou.com/matlabcentral/fileexchange/17935
实验后奥特曼
我用丹尼斯的方法实现了这个函数。它工作得很完美。Thanl。但我不明白你是如何计算出下面一行中的AdjustmentValueChangedCallback属性的
jSlider。AdjustmentValueChangedCallback = {@FollowSliceSliderCallback,guidata(gcbo)};
这所有其他属性我可以使用jSlider。(.....)
以及如何找到他们。
谢谢你的建议
Tanuj
嗨,大家好,如果你们不介意的话,还有一个愚蠢的问题。我是matlab的中级用户,并正在学习更多。我不太明白两者之间的区别
1) jControl函数
2) findjObj函数,和
3) uiComponent函数。
感谢您的帮助。Tanuj
R2008警告可以通过输入消除:
警告(“关闭”、“MATLAB: HandleGraphics: ObsoletedProperty: JavaFrame”);
警告(“关闭”,“MATLAB: uitreenode: MigratingFunction”);
我将很快将其添加到新版本中,但您可以简单地在启动文件或Matlab命令窗口中使用它。
实验后
在R2008a中运行该命令会出现以下警告:
警告:figure JavaFrame属性将在未来的版本中被淘汰。有关更多信息,请参阅JavaFrame资源on
MathWorks网站。
>在findjobj>getRootPanel 266
在findjobj中为164
我想ln 257应该是
集(0,' ShowHiddenHandles ', '对');
而不是
集(0,' ShowHiddenHandles ', '关闭');
谢谢!
一个伟大的作品!谢谢!
Yair,你能让它和08a兼容吗?它会在08a中导致一堆线程错误/警告。
谢谢你!
Peter -你所需要做的就是添加“- nommenu”选项来防止扫描菜单栏。例如:jObj=findjobj(hObj,'- nommenu ');不幸的是,我无法找到一种方法在不实际激活所有菜单选项的情况下扫描菜单栏。
是只有我还是每个使用这个脚本的人在初始化时都有问题?
每当启动我自己的脚本使用findjobj,“它”滚动通过顶部菜单('文件','编辑','查看','插入',…'帮助')。这有点烦人
谢谢你的回复,Yair!
我正在使用:% $修订:1.9 $ $日期:2007/08/14 23:03:04 $,这是我在Mathworks(本页)上单击.m按钮时获得的版本。真的有我后来的版本吗?
尽管如此,您提供了必须呈现控件的解决方案。我在OpeningFcn中创建了uicontrol和javacallback。
我保留了uicontrol的创建,但现在我将以下代码行移动到OutputFcn(虽然不确定这是否是一个合适的地方):
jSlider = findjobj(处理。sliceSlider);
drawnow;
jSlider。AdjustmentValueChangedCallback = {@FollowSliceSliderCallback,guidata(gcbo)};
现在它工作得很完美。再次感谢!
丹尼斯
丹尼斯,谢谢你的反馈。
请确保您使用的是FindJObj的最新版本(当前日期为2007-11-13)。另外,在创建UI控件后立即调用findjobj时,必须让Matlab/Java引擎有时间完全呈现控件。这可以用一个简单的drawnow命令来完成,后面可能跟着一个小暂停(0.01)。
实验后
我发现
jSlider = findjobj(hSlider)
Ans = <1x0>
尽管只是在做
findjobj
列出包括滑块在内的所有java对象。
此外,当只使用命令窗口时,它可以使用find:我可以使用一个带回调的滑块创建图形,它会连续调用一个.m文件。
丹尼斯
利用Matlab 7.5 (R2007b)编写
1 hSlider = uicontrol('style','slider');
2 jSlider = findjobj(hSlider);
3 jSlider。AdjustmentValueChangedCallback = @FollowSliceSlider_Callback;
我得到:
类句柄不存在公共字段AdjustmentValueChangedCallback
使用:
集(jSlider,
'AdjustmentValueChangedCallback', @FollowSliceSlider_Callback);
我没有得到错误,但回调函数从未到达。
我是不是遗漏了什么?
谢谢你的帮助
丹尼斯
Bob——FindJObj显示的底部树分支是句柄图形层次结构——只有顶部分支是Java层次结构。如果您没有看到它,可能您没有使用FindJObj的最新版本。
这很有趣,它是否容易组织对象的方式,因为他们认为在子/父处理图形用户将看到他们?
cellfun行为在Matlab 7.1中发生了变化——不幸的是FINDJOBJ依赖于新的行为,所以你必须有7.1+版本才能运行。很抱歉造成了混乱……
你好Yair !
很抱歉在邮件中打错了。发出的matlab命令是“findjobj”而不是“finjobj”。我没有重命名文件。文件名保存为“findjobj”。m”。我通过在m文件中设置断点来确保脚本运行。
这里我重申一下这个问题。
如果我发出命令,就会创建图形窗口,并得到以下错误消息
> > findjobj
findjobj
???findjobj:函数名必须为字符串。
如果我为错误设置断点,错误将在代码的第234行报告。error变量的值为
K > >犯错
呃=
函数名必须是字符串。
标识符:“MATLAB: cellfun: InvalidFirstInput”
Java版本为
Java 1.5.0与Sun Microsystems Inc.Java HotSpot(TM) Client VM(混合模式)
与问候,
YP
--
在MATLAB版本7.0.4.365 (R14) Service Pack 2中,当findjobj运行时,我得到以下错误(带参数和不带参数)
> > finjobj
???findjobj:函数名必须为字符串。
这是我在Matlab Central中看到的最好的一段Matlab/Java代码。我非常感谢作者分享他的知识。