MATLAB提供了addlistener
函数。
侦听器使我们能够跟踪对象属性的变化并对其进行操作。例如,我们可以创建一个非常简单的侦听器,当axes
对象的'YLim'
属性更改时,该侦听器将在命令窗口中显示一条消息:
% Example using axes
ax = axes();
addlistener(ax, 'YLim', 'PostSet', @(src, evnt)disp('YLim changed'));
尝试平移轴或放大/缩小,看看会发生什么。效果很好。
我需要执行相同的操作,但是要使用uiaxes
。
不幸的是,看来我们不允许这样做。尝试运行以下示例:
% Example using uiaxes
ax = uiaxes();
addlistener(ax, 'YLim', 'PostSet', @(src, evnt)disp('YLim changed'));
它抛出此错误:
使用matlab.ui.control.UIAxes / addlistener时出错 PostSet侦听器,类“ matlab.ui.control.UIAxes”中的属性“ YLim” 未定义为SetObservable。
我已阅读文章Listen for Changes to Property Values和Observe Changes to Property Values,并了解到必须将一个属性声明为SetObservable
才能被收听:
classdef PropLis < handle
properties (SetObservable)
ObservedProp = 1 % <-- Observable Property
end
end
我尝试通过UIAxes
查看edit matlab.ui.control.UIAxes
类的定义,但是由于它是P-file,所以不可能。
如果无法观察到'YLim'
,该如何跟踪该属性的变化?
我在MATLAB R2018b中使用App Designer。
答案 0 :(得分:4)
我们应该将侦听器附加到内部Axes
对象,而不是UIAxes
本身。试试这个:
hFig = uifigure();
hAx = uiaxes(hFig);
addlistener(struct(hAx).Axes, 'YLim', 'PostSet', @(src, evnt)disp("YLim changed"));
hAx.YLim = [0 2];
万一有人想知道,我是通过反复试验发现的。
在R2018a和R2018b上进行了测试。
答案 1 :(得分:0)
非常感谢您提供此解决方案!我在放大UIAxes上的3D数据时遇到了一个真正的问题。 3D轴在z = 0(plotted as a surface)处包含.png背景光栅图,在x-y-x中包含无人机飞行的3D位置。当我放大时,z也将放大,新的z限制将排除我一直希望显示的地图。奇怪的是,设置
app.UIAxes2.Interactions = [zoomInteraction('Dimensions','xy')];
使用鼠标上的滚轮进行缩放时可以解决此问题,但是如果我选择了缩放工具栏按钮(单击以进行缩放),它仍会放大z。真令人沮丧。
为解决这个问题,我使用了您的示例,但将侦听器添加到了“ ZLim”,并制作了一个回调函数,该函数可以查看图的所有元素,并在ZLim发生变化时重置ZLim以包括所有数据。 。
warning('off','MATLAB:structOnObject');
addlistener(struct(app.UIAxes2).Axes, 'ZLim', 'PostSet', @(src,evnt)mapholdaltlims(app,app.UIAxes2));
function [inclusivezlim] = mapholdaltlims(app,ax)
objwithz = findobj(app.UIAxes2.Children,'-property','ZData');
currmin_z = 0;
currmax_z = 0;
for i = 1:length(objwithz)
currmin_z = min([min(min(objwithz(i).ZData)), currmin_z]);%Need double mins because data could be 2d surface
currmax_z = max([max(max(objwithz(i).ZData)), currmax_z]);
end
inclusivezlim = [currmin_z currmax_z];
ax.ZLim = inclusivezlim;
%disp('Updated the limits')
end
老兄,这真是痛苦。我很高兴它现在可以工作了。再次感谢。