滑块在使用后从 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

任何帮助不胜感激!我想我误解了轴的概念。当我打印到我创建的轴控柄时,为什么图形的其他部分也会受到影响?如果有人能向我解释这个图形手柄系统的基本工作原理,那也非常好!

虽然达仁山的回答是正确的,但这种行为足够奇怪,我很想知道它背后的原因。

逐步浏览plotmatrix源,我们可以找到删除滑块对象的行:

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

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

在高级图形代码的开头使用newplot来确定 图形输出的目标图形和轴。呼叫newplot可以更改当前图形和当前轴。基本上,有 在现有图形中绘制图形时的三个选项和 轴:

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

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

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

哦。。。

所以newplot删除滑块对象。


那么,为什么hold阻止滑块被删除,尽管它是轴方法而不是图形方法?首先,请查看文档中的"算法"主题:

hold函数设置AxesPolarAxesNextPlot属性 反对'add''replace'

因此,hold on将其设置为当前轴的'add'。但是,由于我目前无法弄清楚的原因,这也使该数字的NextPlot也设置为add

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

f = figure('NextPlot', 'replacechildren'); 
ax = axes; 
fprintf('NextPlot Status, base:nFig: %s, Ax(1): %snn', f.NextPlot, ax.NextPlot)
hold on
fprintf('NextPlot Status, hold on:nFig: %s, Ax(1): %snn', 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可以解决问题。


根据newplot的文档,我们还可以设置滑块 UIcontrol 的HandleVisibility,以使其免于被破坏:

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

当你调用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

相关内容

  • 没有找到相关文章

最新更新