Discover MakerZone

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi

Learn more

Discover what MATLAB® can do for your career.

Opportunities for recent engineering grads.

Apply Today

Help with GUI panels

Asked by aurc89 on 22 Aug 2014
Latest activity Commented on by aurc89 on 22 Aug 2014

Hi ! I need to create a multiple GUI with Matlab, i.e. a GUI made of more panels, where each panel, containing more commands (push buttons, edit texts, axes...), can be visualized separately (hiding the other panels) by pressing a Push button. For example, I created a panel, called Panel_1, like this

Now I want to create another panel, let'say Panel_2, with other commands. Then, I want to visualize one of the two panels separately (and acting on its commands) by selecting an appropriate push button, like this:

Let's call uipanel1 and uipanel2 the tags associated to the two panels, and pushbutton_panel1 and pushbutton_panel2 the tags associated to the two push buttons. By pressing push button "Panel_1" I want to visualize the Panel_1 and act on its commands, by pressing push button "Panel_2" I want to visualize the Panel_2 and act on its commands. Of course, when working in Panel_2 I want to be able to recall functions associated to the commands contained in Panel_1. These are the callback functions I wrote, associated to the push buttons:

% --- Executes on button press in pushbutton_panel1.
function pushbutton_panel1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_panel1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.uipanel1,'visible','on')
set(handles.uipanel2,'visible','off')
% --- Executes on button press in pushbutton_panel2.
function pushbutton_panel2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton_panel2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
set(handles.uipanel1,'visible','off')
set(handles.uipanel2,'visible','on')

But it doesn't work: when I press Run, I see this:

When I press Push button 'Panel_1' , I see this:

and, when pressing Push button 'Panel_2', I see nothing:

Can you help me to solve this? Thanks!

2 Comments

Andrew Reibold on 22 Aug 2014

I have done the same thing before, and just tried a test case with your code and it worked fine for me. Make sure to try closing your figure and reopening and retrying, and also I would double check that both don't say the same command, or that you accidentally swapped on and off and 1 and 2 at the same time effectively making it the same. If you copy/pasted that, its not the problem.

    set(handles.uipanel1,'visible','on')
    set(handles.uipanel2,'visible','off')

I guess you could also double check that everything has the right tag names but looks like your example is defaults so that doesn't seem promising either.

If all else fails, I would try remaking the panels and starting over if they are not too complex. If you accidentally goofed something somehow or corrupted a save file, guis can be a real mess sometimes.

Adam on 22 Aug 2014

Did you get any error message on the command line? e.g.

Reference to non-existent field 'uipanel2'.
aurc89

Products

No products are associated with this question.

2 Answers

Answer by Joseph Cheng on 22 Aug 2014
Edited by Joseph Cheng on 22 Aug 2014
Accepted answer

So what is happening in your examples is that you placed panel 2 inside panel 1. That is why in the initial panel contains both overlapping. Then when you're doing your panel 1 button callback you see the correct panel 1 (as you're hiding the overlapping panel 2) and nothing in the panel 2 button callback as you're hiding panel 1 (and everything inside of it, which includes panel 2).

To get around this is that you can overlap them by using the arrow keys when you highlight instead of using the mouse and drag them. When you use the mouse and drag one on top of the other it places one inside the other. hitting ctrl+arrow key makes a coarse move and just arrows does it by pixel.

Another approach is to instead of placing them ontop of each other use the set() and the position parameter to move the panels around (ie off window and out of sight and move the desired one into position). I do not know if there are down sides (performance wise) but i have done this in the past.

1 Comment

aurc89 on 22 Aug 2014

You're right, that was the problem! Thank you very much :)

Joseph Cheng
Answer by Robert Cumming on 22 Aug 2014
Edited by Robert Cumming on 22 Aug 2014

This is a good example of why GUIDE is not really suitable at creating even mildly complex GUIs, when I started coding in Matlab I quickly moved away from GUIDE and started creating GUIs from code directly. Over the years I developed this extensively.

So much so that I have a GUI Toolbox which I license to clients - I am in the final stages of my own version of GUIDE to complement this - i.e. a multi tab/paged GUI which you can create interactively.

0 Comments

Robert Cumming

Contact us