【发布时间】:2013-08-25 16:52:12
【问题描述】:
问题
我如何获得双精度类型句柄的事件和属性列表,例如 figure、axes?
问题
Matlab 文档要求您使用WindowButtonDownFcn、WindowButtonMotionFcn 等来收听界面上发生的任何事情。问题是这个属性非常有限,因为the following fact:
将变量保持在范围内
当 MATLAB 计算函数句柄时,相同的变量在 范围与创建函数句柄时一样。(相反,回调 指定为字符串在基础工作区中进行评估。)这 简化了管理全局数据的过程,例如对象 句柄,在 GUI 中。
是的,这是完美的,如果您不必从 ButtonDownFcn 重新定义、添加或删除回调,因为如果这样做,您将失去其他函数句柄变量范围,因为你在一个新的范围内声明它们,可能肯定不会包含你需要的变量。
因此,一种方法是监听事件本身,而不是在事件激活时调用的属性,这样做,您不必费心重新声明 ButtonDownFcn 以及如何将变量保持在范围内,因为其他解决方案实施起来非常缓慢!。如果我可以像使用handle.listener 或addlistener matlab 监听工具那样直接监听事件,我就不必为此烦恼了。
一种已知的好方法
似乎最好的解决方案之一是 this FEX,它赋予了弱 matlab WindowButtonDownFcn、WindowButtonDownFcn 以及 matlab 具有的任何属性“监听器”功能,因此您可以拥有任意数量的函数来监听变化您的图形界面,而不必关心您的其他函数句柄是否会丢失它们的范围变量。
有了这个,我不需要获取 matlab 事件,因为它为我包装了所有内容。但是,matlab 引导您的用户使用损坏的功能而不是记录更好的方法并引导人们将所有内容包装起来,以便他们可以按应有的方式使用东西,这仍然让我感到有趣。
可能有用的信息。
我知道meta.class 会给我一个类所具有的所有属性、事件等。对于我有一个继承自handle 的类:
>> EventMeta = ?Event
EventMeta =
class with properties:
Name: 'Event'
Description: ''
DetailedDescription: ''
Hidden: 0
Sealed: 0
Abstract: 0
ConstructOnLoad: 0
HandleCompatible: 1
InferiorClasses: {0x1 cell}
ContainingPackage: []
PropertyList: [64x1 meta.property]
MethodList: [29x1 meta.method]
EventList: [2x1 meta.event]
EnumerationMemberList: [0x1 meta.EnumeratedValue]
SuperclassList: [1x1 meta.class]
使用该元数据,我可以从 Event 类中获取 EventList,它们是:
>> EventMeta.EventList.Name
ans =
attemptToClick
ans =
ObjectBeingDestroyed
好吧,在这种情况下,这并不是一件好事,因为我已经实现了它并且我知道它所具有的事件,因为我有源代码。问题是,如果我可以获得 figure 的元类(如果可能的话),我可以访问其实现的 Events(如果它们在 matlab 上可用)。
【问题讨论】:
标签: matlab user-interface reflection event-handling handle