| User guide | ![]() ![]() |

When a uiextras.BoxPanel has its "DockFcn"
filled in, a dock/undock button (
/
) is shown in the upper-right of the
title-bar. When the user clicks this button the specified function
is called. Since re-docking the panel into its previous parent
depends on the type of parent, it is up to the user to write
some code to actually extract or insert the panel.
The following simple example shows how to add dock/undock functionality to a box full of panels. Save the code into a file called "dockexample.m" to run it.
(The code for this example can be found here: [ view | edit | run ] )
Open a new figure window and add three panels.
functiondockexample()% Create the window and main layoutfig =figure('Name','Dockable GUI example', ...'NumberTitle','off', ...'Toolbar','none', ...'MenuBar','none', ...'CloseRequestFcn', @nCloseAll ); box =uiextras.HBox('Parent', fig );% Add three panels to the boxpanel{1} =uiextras.BoxPanel('Title','Panel 1','Parent', box ); panel{2} =uiextras.BoxPanel('Title','Panel 2','Parent', box ); panel{3} =uiextras.BoxPanel('Title','Panel 3','Parent', box );% Add some contents
uicontrol('Style','PushButton','String','Button 1','Parent', panel{1} );uicontrol('Style','PushButton','String','Button 2','Parent', panel{2} );uicontrol('Style','PushButton','String','Button 3','Parent', panel{3} );

We set each panel to call the same dock/undock function. This function is nested inside the main function so that it has access to the main function's variables. A better way to do this is to make the main function into a class, but this nested-function approach is fine for simple applications.
Note that as soon as we set the "DockFcn" property the Dock/Undock
icon appears in the top-right of each panel. We use a cell-array to pass an
extra argument, the panel number, to the minimize function. This extra argument appears after the usual
eventSource and eventData arguments.
% Set the dock/undock callback
set( panel{1},'DockFcn', {@nDock, 1} );set( panel{2},'DockFcn', {@nDock, 2} );set( panel{3},'DockFcn', {@nDock, 3} );%-------------------------------------------------------------------------%
functionnDock( eventSource, eventData, whichpanel )% Set the flagpanel{whichpanel}.IsDocked = ~panel{whichpanel}.IsDocked;ifpanel{whichpanel}.IsDocked% Put it back into the layoutnewfig =get( panel{whichpanel},'Parent');set( panel{whichpanel},'Parent', box );delete( newfig );else% Take it out of the layoutpos =getpixelposition( panel{whichpanel} ); newfig =figure( ...'Name',get( panel{whichpanel},'Title'), ...'NumberTitle','off', ...'MenuBar','none', ...'Toolbar','none', ...'CloseRequestFcn', {@nDock, whichpanel} ); figpos =get( newfig,'Position');set( newfig,'Position', [figpos(1,1:2), pos(1,3:4)] );set( p{whichpanel},'Parent', newfig, ...'Units','Normalized', ...'Position', [0 0 1 1] );endend% nDock
If the user closes the main window we need to also close any other windows that were created. This can be done by finding the window that contains each panel and deleting it.
%-------------------------------------------------------------------------%
functionnCloseAll( ~, ~ )forii=1:numel( panel )ifisvalid( panel{ii} ) && ~strcmpi( panel{ii}.BeingDeleted,'on') figh =ancestor( panel{ii},'figure');delete( figh );endendend% nCloseAllend% Main function

Undocking the middle panel causes the other two to fill the vacated space. The undocked panel appears in its own window, with the "Undock" icon replaced by a "Dock" icon.
.
Re-docking the panel would cause it to be appended to the right of the list in the original window. Closing the main window causes all panels, docked or undocked, and their enclosing windows to be closed.
![]() |
Minimize and maximize | [Top] | Using layouts inside GUIDE GUIs | ![]() |