尽管持有,Matlab 在回调中打开新图

Matlab opens new figure in Callback despite hold

我正在使用 MATLAB 的 GUIDE 创建 GUI。比如说,GUI 由一个名为 axis1 的轴组成 和一个名为 slider1 的滑块。进一步说我想绘制一些东西(例如一个盒子)到 axis1 并用滑块改变盒子的高度。

我尝试通过向滑块添加一个侦听器来做到这一点:

hListener = addlistener(handles.slider1,'Value','PostSet',@(src,evnt)boxHeightChange(src,evnt, handles.figure1));

在 GUI 的打开函数中。我进一步定义:

function boxHeightChange(src, event, figname)
   handles = guidata(figname);
   % delete "old" box
   delete(handles.plottedHandle);
   % bring axis in focus
    axes(handles.axes1);
   % plot the new box (with changed size)
    hold on; boxHandle = plotTheBox(event.AffectedObject.Value); hold off
    handles.plottedHandle = boxHandle;
    % update saved values
    guidata(figname, handles);
end

这有效,但总是打开一个新图形来绘制可调整大小的框而不是绘制到 handles.axes1。我不明白为什么,因为我调用 axes(handles.axes1);hold on; 有什么想法可以解释这种行为吗?

我会 post 解决我自己的问题。

显然,侦听器的回调未声明为 "GUI Callback",这就是如果 GUI 选项 "command-line accessibility" 未设置为,则无法从 boxHeightChange 访问 GUI 的原因"On"。

这意味着:在 GUIDE 中转到工具 -> GUI 选项并将 "Command-line accessibility" 设置为 "On"。

大多数绘图函数允许您传递名称值对 'Parent', ah,其中 ah 指定要绘制的轴。我认为这是处理您的问题的最佳方法。您的实际绘图命令似乎包含在 plotTheBox 函数中,因此您必须以某种方式传递坐标轴句柄。

您的绘图命令将如下所示:

plot(a,'Parent',handles.axes1)

你自己用不同的方法解决了这个问题,但我认为你应该按照我的方法来做,因为它更明确并且不太可能导致不可预见的问题。