cod*_*tor 7 matlab listener observable matlab-figure matlab-app-designer
MATLAB 提供了该addlistener函数。
侦听器允许我们跟踪对象属性的变化并对其采取行动。例如,我们可以创建一个非常简单的侦听器,当对象的'YLim'属性axes发生更改时,它将在命令窗口中显示一条消息:
% Example using axes
ax = axes();
addlistener(ax, 'YLim', 'PostSet', @(src, evnt)disp('YLim changed'));
Run Code Online (Sandbox Code Playgroud)
尝试平移轴或放大/缩小,看看会发生什么。这工作正常。
我需要做同样的事情,但使用 anuiaxes代替。
不幸的是,我们似乎不允许这样做。尝试运行以下示例:
% Example using uiaxes
ax = uiaxes();
addlistener(ax, 'YLim', 'PostSet', @(src, evnt)disp('YLim changed'));
Run Code Online (Sandbox Code Playgroud)
它抛出这个错误:
错误使用 matlab.ui.control.UIAxes/addlistener 添加 PostSet 侦听器时,类“matlab.ui.control.UIAxes”中的属性“YLim”未定义为 SetObservable。
我已经阅读了“监听属性值的变化”和“观察属性值的变化”的文章,我了解到必须声明一个属性才能SetObservable被监听:
classdef PropLis < handle
properties (SetObservable)
ObservedProp = 1 % <-- Observable Property
end
end
Run Code Online (Sandbox Code Playgroud)
我试过通过查看UIAxes类定义,edit matlab.ui.control.UIAxes但这是不可能的,因为它是一个P-file。
如果'YLim'不可观察,那么我如何跟踪此属性的变化?
我在 MATLAB R2018b 中使用App Designer。
我们应该将侦听器附加到内部Axes对象,而不是它UIAxes本身。尝试这个:
hFig = uifigure();
hAx = uiaxes(hFig);
addlistener(struct(hAx).Axes, 'YLim', 'PostSet', @(src, evnt)disp("YLim changed"));
hAx.YLim = [0 2];
Run Code Online (Sandbox Code Playgroud)
如果有人想知道,我是通过反复试验发现的。
在 R2018a 和 R2018b 上测试。