Patrick Happel
Patrick Happel

Reputation: 1351

addChild for uifigure components

I'm trying to develop my first GUIs with uifigure (programmatically, not with appdesigner [but I have added it as a keyword since it is related]), and (as expected) I'm missing some of the extended features and widgets as provided by the GUI Layout Toolbox and the Widgets Toolbox for standard java figures.

Thus, I tried to change some widgets that I had developed to uifigure, and uigridlayout seems to be quite handy to replace the uix.VBox and uix.HBox from the GUI Layout Toolbox.

For standard java figures, assume I have a class MyWidget and a corresponding instance mywidget of it. MyWidget would be, finally, an ancestor of matlab.ui.container.internal.UIContainer which provides an addChild method which can be overriden to customize the behaviour of

  uicontrol(mywidget)

I'm looking for the same for uifigure components. Assume the follwing class derived from matlab.ui.container.GridLayout, which is the class of the result of a uigridlayout call.

classdef MyGrid < matlab.ui.container.GridLayout
    methods
        function self = MyGrid(varargin)
            self = [email protected](varargin{:});
        end
    end
    methods ( Access = protected )

        function addChild(self, child)
            disp('hooray');
            [email protected](self, child);
        end
    end
end

When I now initiate a MyGrid instance

g = MyGrid()

everything looks good:

g = 

  MyGrid with properties:

    RowHeight: {'1x'  '1x'}
    ColumnWidth: {'1x'  '1x'}

but adding a child to it does not call the addChild method:

>> uibutton(g)

ans = 

  Button (Button) with properties:

               Text: 'Button'
               Icon: ''
    ButtonPushedFcn: ''
           Position: [100 100 100 22]

Note: No output of hooray above. The Parent property is correct:

>> ans.Parent

ans = 

  MyGrid with properties:

      RowHeight: {'1x'  '1x'}
    ColumnWidth: {'1x'  '1x'}

  Show all properties

From this I guess that addChild is not the method used (at least by matlab.ui.container.GridLayout) to add a child.

Does anyone know the mechanism of adding a child to a container in an uifigure component?

Upvotes: 1

Views: 452

Answers (1)

Patrick Happel
Patrick Happel

Reputation: 1351

I don't know why I didn't look there yesterday, but the code of matlab.ui.container.GridLayout has the (protected) method

function handleChildAdded(obj, childAdded)
    obj.processChildAdded(childAdded);

    obj.addChildLayoutPropChangedListener(childAdded);

    obj.updateImplicitGridSize('childAdded', childAdded);

    obj.updateLastCell('childAdded', childAdded);
end

The method processChildAdded might be better for my purposes, but is private. Anyway, handleChildAdded works:

classdef MyGrid < matlab.ui.container.GridLayout
    methods
        function self = MyGrid(varargin)
            self = [email protected](varargin{:});
        end
    end
    methods ( Access = protected )
        function handleChildAdded(self, child)
            disp('hooray');
            [email protected](self, child);
        end
    end
end
>> g=MyGrid();
>> uibutton(g);
hooray

Upvotes: 1

Related Questions