GUI ButtonDownFcn for clicking on axes
이전 댓글 표시
Hi all, I've got 2 axes in my GUI, and I want to be able to launch a different .m file when the user clicks either axes.
Currently I can launch a function, but I'm unable to differentiate between the different axes, and I'd rather directly run a .m script if possible.
I currently have:
setappdata(gcf,'bdfcnhandle',load_stuff);
axes(handles.axes3)
h(1)=imshow(thumb_1, [])
axes(handles.axes4)
h(2)=imshow(thumb_2, [])
set(h,'buttondownfcn','feval(getappdata(gcf,''bdfcnhandle''));');%
function load_stuff(hObject, eventdata, handles) X=100;
Also using the code above, I seem to be unable to access the handles structure in my "load_stuff" function!
Can anyone help my plight?
Thanks, Jim
채택된 답변
추가 답변 (2개)
Walter Roberson
2011년 6월 2일
setappdata(gcf,'bdfcnhandle',load_stuff);
is going to run load_stuff (with no parameters), and take its return value and set that as bdfcnhandle in the app data.
I would have to do some digging to figure out what you could do along the lines you have been working.
Note that imshow() returns the handle of an image object, not the handle of an axes. When you are setting the buttondownfcn you are doing so for the images, not for the axes. If you want it to be the axes, you should set(h,'HitTest','off') and set the buttondownfcn against the axes.
What I would do is
set([handles.axes3, handles.axes4], 'buttondownfcn', @load_stuff)
function load_stuff(hObject, eventdata)
handles = guidata(hObject);
theaxes = ancestor(hObject,'axes');
if theaxes == handles.axes3
%axes3 stuff
elseif theaxes == handles.axes4
%axes4 stuff
end
end
and I wouldn't use bdfcnhandle at all. This code is also designed for calling for either the image object or the axes object.
댓글 수: 6
Jim O'Doherty
2011년 6월 2일
Robert Cumming
2011년 6월 2일
walters example is adding a callback to the AXIS, not the image. If the image covers the complete axis then you wont be able to trigger the axis callback.
Add a callback to the images and you will that it gets called.
Walter Roberson
2011년 6월 2일
Quite. That's why I spoke of setting HitTest off for the images.
Jim O'Doherty
2011년 6월 7일
Walter Roberson
2011년 6월 7일
In your setup routine,
handles.h = h;
guidata(hObject,handles).
Then in load_stuff,
h = handles.h;
if hObject == h(1)
%image 1 stuff
elseif hObject == h(2)
%image 2 stuff
else
%something went wrong
end
Patrick Kalita
2011년 6월 7일
Generally it would be better to have each image implement it's own ButtionDownFcn, precisely to avoid the "else ... % something went wrong" case.
Robert Cumming
2011년 6월 2일
Why dont you just do:
set ( h(1), 'ButtonDownFcn', {@mfile_1} );
set ( h(2), 'ButtonDownFcn', {@mfile_2} );
댓글 수: 3
Jim O'Doherty
2011년 6월 2일
Robert Cumming
2011년 6월 2일
yes the command is expecting a function. Change your script to a function and it will work.
Walter Roberson
2011년 6월 2일
The load_stuff example you should was a function ?
Beware that when you run the script, the workspace will be... ummm, probably the base workspace.
카테고리
도움말 센터 및 File Exchange에서 Creating, Deleting, and Querying Graphics Objects에 대해 자세히 알아보기
제품
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!