Trying to Program a Switch-Case Expression for a Pop-up Menu in a MATLAB GUI

Asked by Caleb on 18 Jul 2012
Latest activity Commented on by Caleb on 23 Jul 2012

Can someone tell me what's wrong with my syntax or any other errors you spot?

% --- Executes on selection change in popupmenu_filters.
function popupmenu_filters_Callback(hObject, eventdata, handles)
% hObject    handle to popupmenu_filters (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% determine which filter to apply by reading string in pop-up menu
str = get(hObject, 'String');
val = get(hObject, 'Value');
% set current filter to the user-selected filter
switch str{val};
    case 'imdilate' 
        handles.current_filter = imdilate
    case 'imerode'
        handles.current_filter = imerode
    case 'imopen'
        handles.current_filter = imopen
    case 'imclose'
        handles.current_filter = imclose
    case 'imtophat'
        handles.current_filter = imtophat
    case 'imbothat'
        handles.current_filter = imbothat
    case 'entropy filter'
        handles.current_filter = entropyfilt
end
handles.image2 = handles.current_filter(handles.image);
  handles.axes2(imshow(handles.image2));
  % pushbutton_save handles structure
  guidata(hObject, handles);

0 Comments

Caleb

3 Answers

Answer by Walter Roberson on 18 Jul 2012
Accepted answer
handles.current_filter = @imdilate;

Without the @ it is going to _ call_ imdilate with no arguments.

0 Comments

Walter Roberson
Answer by Caleb on 19 Jul 2012

So when I'm adding slider capability to the code, how do I call that within the program. Would it be:

handles.image2 = handles.current_filter(handles.image, [handles.slider1 handles.slider2]; 

or something like that?

5 Comments

Walter Roberson on 20 Jul 2012

Wait... just how old is your MATLAB?

Caleb on 23 Jul 2012

I'm using R2011b

Caleb on 23 Jul 2012

And using the @function_handle has worked so far. I just haven't been able to apply the changes from the slider to the function.

Caleb
Answer by Sean de Wolski on 19 Jul 2012
Edited by Sean de Wolski on 19 Jul 2012

Rather than using switch I would package this as a cell array of function handles and then extract the value:

ops={@imdilate,@imerode,@imopen} %etc
handles.current_filter = ops{val};

4 Comments

Walter Roberson on 19 Jul 2012

Your code had

val = get(hObject, 'Value');

so Sean used that.

Just make sure your ops structure is in the same order as the entries in your String property.

Caleb on 19 Jul 2012

Now it's giving me this error:

Attempted to access handles.axes2(234.013); index must be a positive integer or logical.
Error in FESgui>popupmenu_filters_Callback (line 562)
handles.axes2(imshow(handles.image2));

Even though my handles structure contains handles for axes2

            pushbutton_browse: 238.0118
                        axes2: 233.0125
                        axes1: 228.0066
                     uipanel5: 243.0062
                     uipanel4: 241.0061
                     uipanel3: 239.0079
                     uipanel2: 56.0078
Sean de Wolski on 19 Jul 2012

It should just be:

imshow(handles.image2,'parent',handles.axes2);
Sean de Wolski

Contact us