我用GUIDE创建了一个MATLAB GUI。我有一个带回调函数的滑块。我已经注意到,这个回调,应该执行'滑块移动',实际上只有当滑块移动并释放鼠标时才会运行。在MATLAB中,如何在拖动滑块时执行回调?
有没有办法得到一个脚本来运行的滑块被拖动,对于情节的现场更新?我认为需要做些事情来阻止剧本运行太多次。
我用GUIDE创建了一个MATLAB GUI。我有一个带回调函数的滑块。我已经注意到,这个回调,应该执行'滑块移动',实际上只有当滑块移动并释放鼠标时才会运行。在MATLAB中,如何在拖动滑块时执行回调?
有没有办法得到一个脚本来运行的滑块被拖动,对于情节的现场更新?我认为需要做些事情来阻止剧本运行太多次。
尽管在移动鼠标时未调用滑块的回调,滑块uicontrol 的'Value'
property被更新为。因此,您可以使用addlistener
创建一个侦听器,当'Value'
属性更改时,它将执行给定的回调。这里有一个例子:
hSlider = uicontrol('Style', 'slider', 'Callback', @(s, e) disp('hello'));
hListener = addlistener(hSlider, 'Value', 'PostSet', @(s, e) disp('hi'));
当您移动正在打印屏幕(听者回调),你应该看到'hi'
滑块,而当你松开鼠标,你会看到'hello'
打印(在uicontrol回调)。
只是为了记录在案,这个问题在详细讨论:http://UndocumentedMatlab.com/blog/continuous-slider-callback/ - 几种可供选择的解决方案都在那里。使用addlistener
gnovice的解决方案是等同于handle.listener alternative
,由于addlistener
基本上只是后者的包装。
如果要执行你传递给uicontrol
相同的原始回调,你可以添加这个通用的监听器,引导了现有的回调:
sld.addlistener('Value','PostSet',@(src,data) data.AffectedObject.Callback(data.AffectedObject,struct('Source',data.AffectedObject,'EventName','Action')));
谢谢,这个例子基本上做什么,我想做。我有一个问题,但; '@(s,e)'在'disp'函数之前做了什么?我猜'''创建disp的句柄,但是'(s,e)'是什么? – 2011-05-18 09:24:23
@Bill:该'@(S,E)'创建一个[匿名功能](http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html),其采用作为输入自变量's'和'e'并执行'disp(...)'。使用[function handles as callbacks](http://www.mathworks.com/help/techdoc/creating_guis/f16-999606.html#f16-1001315)要求函数至少接受两个参数,即使它们不是用过的。这些参数是发出回调('s')的对象的句柄以及它可选提供的事件数据('e')。更多的描述性名称将是'hObject'和'eventData',但我保持简短。 – gnovice 2011-05-18 13:52:50