在MATLAB GUI中使用addlister似乎“删除”现有的句柄

时间:2014-06-02 14:47:03

标签: matlab slider listener matlab-guide

我对MATLAB GUI编程很新(使用GUIDE抱歉),我遇到以下问题:GUI在轴上显示存储在单元阵列中的图像序列。我有几个按钮和一个滑块来滚动序列。为了得到一个连续的滑块'我使用了一个监听器,哪种工作但会产生一些问题:

1)当我按下滑块时,会创建一个图形并显示序列的第一帧,但是当我移动滑块时,序列会显示在我的GUI轴上(这就是我想要的)这个数字变空了。任何人都可以告诉我为什么要创建这个数字,我该如何避免它呢?

2)一旦我按下滑块按钮并因此使用听众,GUI内的所有手柄都不是功能因为Matlab无法识别它们,而且我仍然使用功能滑块/显示器,但我可以“#”;使用按钮。

有关为何会发生这种情况的任何想法?这是我在滑块的Create Function中使用的代码:

function slider2_Frame_Video_Callback(hObject, eventdata, handles)

hListener = addlistener(hObject,'ContinuousValueChange',@(a,b) slider2_Frame_Video_Callback(hObject, eventdata, handles)); % a and b are dummy arguments

guidata(hObject,handles)

在滑块回调中,代码如下所示(基本上在当前轴中显示):

axes(hAxis)
imshow(Movie{frame},'parent',hAxis);

drawnow

%这不起作用,因为matlab无法识别handles.edit_FrameNumber

set(handles.edit_FrameNumber, 'String', frame);

guidata(hObject,handles);

欢迎任何提示,谢谢!

1 个答案:

答案 0 :(得分:1)

我想知道问题的一部分是每次用户移动滑块时是否正在实例化一个侦听器,因为侦听器代码在此回调中并且回调被提供给侦听器(看起来像某种奇怪的后退 - 在那里)。因此,每次用户在幻灯片后释放鼠标按钮时,都会创建一个新的侦听器。这可能会导致其他按钮无法响应时出现问题。

我不会在那里实例化侦听器,而是在GUI的Opening_Fcn中执行此操作:

% --- Executes just before frameSlider is made visible.
function frameSlider_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to frameSlider (see VARARGIN)

% Choose default command line output for frameSlider
handles.output = hObject;

if ~isfield(handles,'hListener')
    handles.hListener = ...
        addlistener(handles.slider1,'ContinuousValueChange',@respondToContSlideCallback);
end

% Update handles structure
guidata(hObject, handles);

我的GUI名为frameSlider;你的将是别的。上面创建了一个侦听器,其中包含一个函数的回调,您需要在同一个* .m文件中定义respondToContSlideCallback

用于响应连续幻灯片的回调的示例正文是

% --- Executes on slider movement.
function respondToContSlideCallback(hObject, eventdata)
% hObject    handle to slider1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB

% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider

% first we need the handles structure which we can get from hObject
handles = guidata(hObject);

% test to display the current value along the slider
disp(['at slider coordinate ' num2str(get(hObject,'Value'))]);

如果您运行此代码,当您从一端到另一端移动滑块时,命令窗口将连续显示滑块坐标。

您的上述代码有一个Movies单元格数组。如何通过回调访问?它是全局变量还是......? hist来自哪里?如果Movies是某个其他函数调用的结果,那么它也可以保存到handles(在从文件加载的任何位置)。我想你还必须将滑块控件坐标映射到你拥有的帧数(虽然你可能已经这样做了吗?)。