如何在Matlab中将uifigure设为当前图形窗口

3

我有一个脚本可以创建多个UI图形界面:

% create fig1
fig1 = uifigure('Name', 'Figure 1');

% create fig2
fig2 = uifigure('Name', 'Figure 2');

% set fig2 as the current figure
set(0, 'currentfigure', fig2);

% get the current figure
gcf

我希望第二个uifigure成为当前图形界面,所以我使用了第三个命令进行设置。然而,当我使用gcf获取当前图形界面时,仍然是第一个。以下是命令行的输出:

ans = 

  Figure (1) with properties:

      Number: 1
        Name: ''
       Color: [0.9400 0.9400 0.9400]
    Position: [514 371 560 420]
       Units: 'pixels'

  Show all properties

问题是什么?


set(groot, 'currentfigure', fig2) 能够正常工作吗? - Andras Deak -- Слава Україні
对我来说,使用Matlab R2019a,它可以正常工作。你是否在set(0, 'currentfigure', fig2);gcf命令之间意外点击了第一个图形? - Matteo V
@MatteoV 可以确认 OP 在 17b 上运行时出现的问题。 - Wolfie
实际上,刚才我只是用 figure 而不是 uifigure 进行了测试。使用正确的命令后,我遇到了同样的问题。似乎 gcf 返回一个句柄到自动创建的 figure 1。 - Matteo V
你的MATLAB版本在这里很重要,因为uifigure和app-designer是相对较新的。例如,HandleVisibility属性默认关闭并且会遮挡uifigure句柄,在17b中始终关闭,但在最新的文档中,看起来你可以选择将其设置为“on”,这可能有助于解决此问题。请[编辑]您的问题以包括您正在使用的MATLAB版本。 - Wolfie
2个回答

1

对于 uifigure 对象,属性 HandleVisibility — 对象句柄的可见性被设置为 'off',这意味着该属性是只读的。

此属性提供有关 Figure 对象在其父级子对象列表中的可见性信息。由于该属性值始终设置为 'off',因此 Figure 对象不可见于其父级子对象列表中,并且无法通过搜索对象层次结构或查询对象属性的函数返回。这些函数包括 gcfgetfindobjclfclose

即使其 HandleVisibility 属性设置为 'off',对象仍然有效。如果您可以访问对象,则可以设置和获取其属性,并将其传递给任何操作对象的函数。但是,gcf 无法返回 App Designer 图形...


HandleVisibility属性不是只读的,当您调用uifigure时,默认情况下将其设置为关闭。 - Kenneth Boyd

0

这段代码可以实现你想要的功能,创建两个图形并将第二个图形置于顶部

% create fig1
fig1 = uifigure('Name', 'MyFig 1');

% create fig2
fig2 = uifigure('Name', 'MyFig 2');

% set fig2 as the current figure
drawnow
figure(fig2)

您会发现图2在顶部,而不是原始代码中的图1。如果调用gcf,它将创建一个新的图形,也将被称为“figure 1”,因为uifigure创建的所有图形都没有设置“HandleVisibility”属性为“on”。在我的代码中,我稍微更改了图形名称,以便如果您运行gcf,您将看到它正在创建一个名为Figure 1的新图形,而不是切换到此代码创建的第一个图形。

如果您想让gcf工作并查看图2,则可以在创建图形时打开HandleVisbility。请使用以下代码替换上面创建图2的行:

fig2 = uifigure('Name', 'MyFig 2', 'handlevisibility', 'on');

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接