Слайдер исчезает из GUI после использования
Я пытаюсь сделать MATLAB GUI программно и сталкиваюсь с проблемой, что мой слайдер исчезает после его использования. Я выделил проблему, чтобы код был коротким. В этом графическом интерфейсе я хочу обновить plotmatrix
каждый раз, когда используется ползунок (игнорируйте тот факт, что значение ползунка не имеет никакого отношения к моей программе, как упоминалось ранее, я действительно хотел сохранить код в чистоте, поэтому я также удалил эту функцию). Вот код (вы должны запустить его как функцию):
function StackruQuestion_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, почему затрагиваются и другие части фигуры? Если бы кто-то мог объяснить мне, как эта система графического дескриптора в основном работает, это было бы очень приятно!
2 ответа
Когда вы звоните plotmatrix
, функция полностью перерисовывает фигуру, чтобы сохранить другие элементы, которые вы должны использовать hold on;
hold off;
заявления:
function StackruQuestion_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
Хотя ответ Дарен Шаня правильный, это достаточно странное поведение, и мне было любопытно посмотреть, что за этим стоит.
Шагая через источник plotmatrix
мы можем найти строку, которая удаляет наш объект-слайдер:
% Create/find BigAx and make it invisible
BigAx = newplot(cax);
Ничего очевидного здесь, что делает newplot
делать?
использование
newplot
в начале графического кода высокого уровня, чтобы определить, какую фигуру и оси нужно выбрать для вывода графики. призваниеnewplot
Можно изменить текущую фигуру и текущие оси. По сути, существует три варианта рисования графики на существующих фигурах и осях:
Добавьте новую графику без изменения каких-либо свойств или удаления каких-либо объектов.
Удалите все существующие объекты, чьи маркеры не скрыты, прежде чем рисовать новые объекты.
Удалите все существующие объекты независимо от того, являются ли их маркеры скрытыми, и сбросьте для большинства свойств значения по умолчанию, прежде чем рисовать новые объекты (дополнительную информацию см. В следующей таблице).
Ой...
Так newplot
удаляет объект слайдера
Так почему же hold
предотвратить удаление ползунка, несмотря на то, что это метод оси, а не метод фигуры? Для начала взгляните на тему "Алгоритмы" в документации:
hold
функция устанавливаетNextPlot
собственностьAxes
или же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
устраняет проблему
Согласно документации для newplot
мы также можем установить HandleVisibility
ползунка UIcontrol, чтобы сохранить его от уничтожения:
% create slider
uicontrol('Parent',f,...
'Style','slider','Callback',{@sliderCallback,AX_main},...
'Units','normalized','Position',[0.05 0.05 0.9 0.05], ...
'HandleVisibility', 'off');