Слайдер исчезает из 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');
Другие вопросы по тегам