MATLAB:在变量更改时执行回调?

3
我正在尝试使用在http://www.mathworks.com/matlabcentral/fileexchange/11546上找到的uitabpanel()构建一个带有多个选项卡的GUI。我想根据当前打开的选项卡调整GUI的大小; 这可以通过uitabpanel.SelectedItem实现。
基本上,我想建立一个回调函数来监视uitabpanel.SelectedItem - 当此变量更改时,GUI窗口应相应地调整大小。一般来说,我正在寻找一种监视变量并在变量更改值时执行回调的方法。
这是否可能? 我该如何做?
谢谢!
2个回答

4

我现在没有MATLAB,但如果它被实现为属性 - 从我快速查看代码中可以看出,它确实是这样的 - 您可以使用 addlistener 函数,并为其提供回调函数。

addlistener(hTab,'SelectedItem','PostSet',@(s,e)disp('SelectedItem changed'))

这正是我所需要的!原来SelectedItem不是一个属性,而底层的选项卡面板只是uipanel对象,我可以通过观察每个选项卡的Visible属性来使用你提出的方法。谢谢! - Dang Khoa

3

我不熟悉文件交换中的uitab。然而,如果它是基于内置的uitab构建的,则应该有一个selectionChangeCallbackselectionChangeFcn属性(取决于您的Matlab版本)。为此回调属性指定一个函数,这样每当选择更改时就可以执行一个函数。

如果这不可能(如果您无法使用对象和设置方法),则唯一监视变量更改的方法是使用TIMER OBJECT,定期轮询变量的值。

编辑 由于FEX uitab基于uipanel,因此您要查找的回调最有可能是ButtonDownFcn。在更改之前,请确保它未被uitab函数使用,否则您将需要编辑该函数。


我肯定可以用面向对象编程来解决这个问题,但我觉得这有点像用喷砂机清理汤饼——对于我认为应该是一个相当简单的任务来说,这有些过度了。我想这并不像我想象的那么简单。我不认为uitabpanel()是基于uitab()的,但我一定会尝试你提到的回调函数。我不认为前者是基于后者的。非常感谢! - Dang Khoa
看起来uitabpanel()是基于uipanel()的。我想我可以切换到uitab(),但说实话,uitabpanel()看起来更漂亮。 - Dang Khoa
@strictlyrude27:啊,好的,你可能想看一下 ButtonDownFcn,它会在每次单击 uipanel 时执行。 - Jonas
谢谢Jonas - 我最终尝试了一下。很遗憾,ButtonDownFcn仅在您单击面板内部时才起作用 - 单击选项卡本身不会执行回调。也许转到uitab是最好的选择?我不喜欢计时器对象的想法,因为我不想主动轮询变量。 - Dang Khoa
1
有一种方法可以通过使用 addlistener 函数来监视变量的更改,如果它是一个属性。请参见我的答案。 - Juhl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接