2011-05-17 115 views
10

我用GUIDE创建了一个MATLAB GUI。我有一个带回调函数的滑块。我已经注意到,这个回调,应该执行'滑块移动',实际上只有当滑块移动并释放鼠标时才会运行。在MATLAB中,如何在拖动滑块时执行回调?

有没有办法得到一个脚本来运行的滑块被拖动,对于情节的现场更新?我认为需要做些事情来阻止剧本运行太多次。

回答

16

尽管在移动鼠标时未调用滑块的回调,滑块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回调)。

+0

谢谢,这个例子基本上做什么,我想做。我有一个问题,但; '@(s,e)'在'disp'函数之前做了什么?我猜'''创建disp的句柄,但是'(s,e)'是什么? – 2011-05-18 09:24:23

+2

@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

0

如果要执行你传递给uicontrol相同的原始回调,你可以添加这个通用的监听器,引导了现有的回调:

sld.addlistener('Value','PostSet',@(src,data) data.AffectedObject.Callback(data.AffectedObject,struct('Source',data.AffectedObject,'EventName','Action'))); 

Related blog post