MATLAB Answers

Distinguish uifigure from figure programmatically

177 views (last 30 days)
Adam
Adam on 12 Jul 2017
Commented: Adam on 7 Feb 2020
Is it possible to distinguish a uifigure (appdesigner) from an old-style figure programmatically by an if type test?
class( hFig )
returns
'matlab.ui.Figure'
for both of them and I can't see anything obvious in the metaclass or properties that I can use to check which it is.
I could just use a try-catch, but I'd prefer to just filter uifigures than catch the error (I have a BusyCursor class which changes the pointer on all open figures to the busy cursor and then back again when it is deleted, but it crashes on uifigures which do not support changes to the 'pointer' property).

  0 Comments

Sign in to comment.

Accepted Answer

Ralph Coleman
Ralph Coleman on 18 Sep 2019
Edited: Ralph Coleman on 18 Sep 2019
Hi
From R2018b, you can simply use:
matlab.ui.internal.isUIFigure(hFig)

  2 Comments

Ali Yar Khan
Ali Yar Khan on 6 Feb 2020
how can i get the highlghted property of my app anywhere in the code ? can i access it in my user defined function which i am calling within callbacks of the gui ?
Adam
Adam on 7 Feb 2020
You have access to all those properties anywhere you have your app object - i.e. anywhere in the app callbacks and, because of reasons passing understanding literally anywhere external since Appdesigner makes all ui components public properties.

Sign in to comment.

More Answers (4)

Zhengyi
Zhengyi on 18 Feb 2019
Edited: Zhengyi on 18 Feb 2019
TL;DR
function val = isuifigure(h)
val = ~isempty(matlab.ui.internal.dialog.DialogHelper.getFigureID(h));
end
The slightly longer story
If you type the following into the console, you will get an error:
>> uialert(figure,'a','b')
Error using uialert (line 42)
First argument must be a figure handle created using the uifigure function.
On line 42 of uialert function, we can see it uses the following method to validate the input handle:
matlab.ui.internal.dialog.DialogHelper.validateUIfigure(hUIFigure)
By reading through this function, we can see the error is thrown when the following function returns empty:
matlab.ui.internal.dialog.DialogHelper.getFigureID(h)
and
function out = getFigureID(f)
out = f.getId();
end
However,
getId()
seems to be a private function. The only option we have is to use getFigureID and check whether it returns a non-empty value.
Finaly, if you like, you can create this utility function to help you get over the long function call:
function val = isuifigure(h)
val = ~isempty(matlab.ui.internal.dialog.DialogHelper.getFigureID(h));
end

  0 Comments

Sign in to comment.


Dev-iL
Dev-iL on 15 Aug 2017
I tried comparing the outputs of:
F = struct(uifigure());
G = struct(figure());
There are several fields that are different by default. Of increased interest are:
JavaFrame, Controller, ControllerInfo, NodeChildren
I cannot guarantee that it will work 100% of the time, but you can try testing for
isstruct(struct(hFig).ControllerInfo)
... if the above returns "true" - it's likely a uifigure.

  0 Comments

Sign in to comment.


Celso Reyes
Celso Reyes on 20 Aug 2018
Edited: Celso Reyes on 21 Aug 2018
The new figures do not show in groot by default -- At least as of Mac version, R2018a -- when ShowHiddenHandles is 'off'. If ShowHiddenHandles is 'on', then it will appear.
As a side note, the new-style uifigure appears when you use allchild(groot) regardless of the ShowHiddenHandles value.
So, one could non-invasive check would look like so...
function style = figtype(f)
g = groot;
oldStatus = g.ShowHiddenHandles;
g.ShowHiddenHandles = 'off';
if any(g.Children == f)
style = 'figure';
else
style = 'uifigure';
end
g.ShowHiddenHandles = oldStatus;
end
So, in practice...
>> newf = uifigure('Name','new');
>> oldf = figure('Name','old');
>> figtype(newf)
ans =
'uifigure'
>> figtype(oldf)
ans =
'figure'
I'm not sure what would make a regular figure's handle hidden, since the Visibility property doesn't do it.

  0 Comments

Sign in to comment.


Andreas Klotzek
Andreas Klotzek on 9 Jan 2019
Hi
I also need an answer to this question.
The answers provided here are not certain to give the correct result. For example if I have a old-style figure with property HandleVisibility = 'off', the test using groot will give the wrong result.
Using properties is also not a stable idea. The behavior might change.
The problem is not only for figure and uifigure. I need the same check on axes/uiaxes or uipanel handles, basically on any graphics handle. One could probably use the ancestor function to redirect the problem for any graphics handle to the figure handle.

  0 Comments

Sign in to comment.

Sign in to answer this question.