使用后滑块从GUI消失

时间:2017-03-24 10:58:47

标签: matlab user-interface slider matlab-figure matlab-gui

我尝试以编程方式制作MATLAB GUI并面对我的滑块在使用后消失的问题。我隔离了问题以保持代码简短。在这个GUI中我想每次使用滑块时刷新plotmatrix(忽略滑块的值与我的程序完全无关的事实,如前所述,我真的想保持代码清洁,这就是为什么我也删除了这个功能)。这是代码(您必须将其作为函数运行):

function StackOverflowQuestion_GUI()
    % clear memory
    close all; clc;

    % initialize figure
    f = figure;

    % create main axes
    AX_main = axes('Parent',f,...
        'Units','normalized','Position',[.1 .2 .8 .7]);

    % create slider
    uicontrol('Parent',f,...
        'Style','slider','Callback',{@sliderCallback,AX_main},...
        'Units','normalized','Position',[0.05 0.05 0.9 0.05]);

    plotmatrix(AX_main,randn(500,3));
    title('Random Plotmatrix');
end

function sliderCallback(~,~,AX_main)   % callback for slider
    plotmatrix(AX_main,randn(500,3));
    title('Random Plotmatrix NEW');
end

任何帮助表示赞赏!我想我误解了AXES的概念。当我绘制到我创建的AXES手柄时,为什么该图的其他部分也会受到影响?如果有人可以向我解释这个图形处理系统基本上是如何工作的那样也是非常好的!

2 个答案:

答案 0 :(得分:6)

虽然daren shan's answer是正确的,但这是一种奇怪的行为,我很想知道它背后的原因。

单步执行plotmatrix的来源,我们可以找到删除滑块对象的行:

% Create/find BigAx and make it invisible
BigAx = newplot(cax);

这里没什么明显的,newplot做了什么?

  

在高级图形代码的开头使用newplot来确定   哪个图形和轴以图形输出为目标。致电newplot   可以改变当前的数字和当前轴。基本上,有   在现有图形和图形中绘制图形时有三​​个选项   轴:

     
      
  • 添加新图形而不更改任何属性或删除任何对象。

  •   
  • 在绘制新对象之前,删除其句柄未隐藏的所有现有对象。

  •   
  • 删除所有现有对象,无论其句柄是否被隐藏,并将之前的大多数属性重置为默认值   绘制新对象(具体请参考下表)   信息)。

  •   

...喔

所以newplot正在删除滑块对象。

那么为什么hold会阻止滑块被删除,尽管它是一个轴方法而不是一个数字方法?首先,请查看文档中的“算法”主题:

  

hold函数设置NextPlotAxes的{​​{1}}属性   对象为PolarAxes'add'

因此'replace'将当前轴设置为hold on。但是,由于我目前无法理解的原因,此也将该数字的'add'设置为NextPlot

我们可以通过一个简短的片段看到这一点:

add

打印哪些:

f = figure('NextPlot', 'replacechildren'); 
ax = axes; 
fprintf('NextPlot Status, base:\nFig: %s, Ax(1): %s\n\n', f.NextPlot, ax.NextPlot)
hold on
fprintf('NextPlot Status, hold on:\nFig: %s, Ax(1): %s\n\n', f.NextPlot, ax.NextPlot)

奇怪的行为,但我不会纠缠于此。

为什么这很重要?返回NextPlot Status, base: Fig: replacechildren, Ax(1): replace NextPlot Status, hold on: Fig: add, Ax(1): add 文档。首先,newplot读取数字的newplot属性以确定要执行的操作。默认情况下,数字的NextPlot属性设置为NextPlot,因此它将保留所有当前图形对象,但'add'显式更改此内容:

plotmatrix

所以if ~hold_state set(fig,'NextPlot','replacechildren') end 来自:

  

在不清除任何已存在的图形对象的情况下绘制到当前图形。

要:

  

删除newplot属性设置为HandleVisibility的所有子对象   并将数字on属性重置为NextPlot

     

这会清除当前数字,相当于发出add   命令。

这解释了滑块消失的原因以及clf解决问题的原因。

根据hold on的文档,我们还可以设置滑块UIcontrol的newplot以防止它被销毁:

HandleVisibility

答案 1 :(得分:1)

当你致电plotmatrix时,该功能完全重绘了数字, 为了保存其他元素,您应该使用hold on; hold off;语句:

function StackOverflowQuestion_GUI()
    % clear memory
    clear; close all; clc;

    % initialize figure
    f = figure;

    % create main axes
    AX_main = axes('Parent',f,...
        'Units','normalized','Position',[.1 .2 .8 .7]);

    % create slider
    uicontrol('Parent',f,...
        'Style','slider','Callback',{@sliderCallback,AX_main},...
        'Units','normalized','Position',[0.05 0.05 0.9 0.05]);

    plotmatrix(AX_main,randn(500,3));
    title('Random Plotmatrix');
end

function sliderCallback(~,~,AX_main)   % callback for slider
    hold on;
    plotmatrix(AX_main,randn(500,3));
    hold off;
    title('Random Plotmatrix NEW');
end