У меня есть некоторые плохие новости и хорошие новости: на основании моих попыток кажется, что нельзя перемещать одну и ту же панель инструментов между контейнерами (вкладками или панелями) из-за ограничения MATLAB, однако возможен обходной путь. Ниже приведены подробности того, как я пришел к такому выводу.
После небольшого исследования я заметил, что некоторые свойства AxesToolbar
меняются после его первого показа, два из них привлекли мое внимание - HasTrueParent
и NodeParent
.
Aha. Таким образом, панель инструментов теперь имеет родительский элемент, что означает, что где-то в иерархии дочерних элементов вкладка должна видеть панель инструментов. Давайте исследуем дальше:
Я добавил другое свойство в ваш класс, Tabs
, и вот как я заполняю его в конструкторе:
self.Tabs(1) = uitab(tg, 'Title', 'tab1');
self.Tabs(2) = uitab(tg, 'Title', 'tab2');
self.Tabs(3) = uitab(tg, 'Title', 'tab3');
self.Tabs = handle(self.Tabs);
Затем, установив после установки (и достижения) точку останова, мы можем видеть, что:
K>> allchild(self.Tabs(1))
ans =
2×1 graphics array:
AnnotationPane
Axes
K>> allchild(self.Tabs(2))
ans =
0×0 empty GraphicsPlaceholder array.
Обратите внимание, что AnnotationPane
? Это слой, который содержит аннотации и, вероятно, также панель инструментов. Как мы можем знать наверняка? Мы можем установить для Visibility
значение 'off'
, и панель инструментов перестает появляться.
Естественно, у кого-то может возникнуть желание изменить Parent
этой панели, но это приводит к ошибке:
Error using matlab.graphics.shape.internal.AnnotationPane/setParentImpl
Cannot change parent of AnnotationPane object.
Так что же можно с этим сделать? Если вы создаете новые оси в каждой новой вкладке,
hFig = figure();
hTG = uitabgroup(hFig);
for iTab = 1 : 3
hTab = uitab(hTG, 'title', "Tab" + iTab);
hPanel = uipanel(hTab);
hAxes(iTab) = axes(hPanel);
end
их панели инструментов будут созданы правильно. Оттуда, это вопрос перемещения дочерних элементов (осей) и обновления лимитов / области просмотра.