2011-05-17 55 views
10

Tôi đã tạo một GUI MATLAB bằng GUIDE. Tôi có một thanh trượt với chức năng gọi lại. Tôi đã nhận thấy rằng gọi lại này, được cho là để thực hiện 'trên phong trào trượt', trên thực tế chỉ chạy một khi thanh trượt đã được di chuyển và chuột phát hành.Trong MATLAB, làm cách nào bạn có thể thực hiện gọi lại trong khi thanh trượt đang được kéo?

Có cách nào để chạy tập lệnh khi thanh trượt đang được kéo, để cập nhật trực tiếp một ô không? Tôi sẽ cho rằng cần phải có một cái gì đó để ngăn chặn kịch bản được chạy quá nhiều lần.

Trả lời

16

Mặc dù gọi lại của thanh trượt không được gọi khi di chuyển chuột, các 'Value' property của thanh trượt uicontrol đang được cập nhật. Do đó, bạn có thể tạo người nghe bằng cách sử dụng addlistener sẽ thực thi một cuộc gọi lại đã cho khi các thay đổi về thuộc tính 'Value'. Dưới đây là một ví dụ:

hSlider = uicontrol('Style', 'slider', 'Callback', @(s, e) disp('hello')); 
hListener = addlistener(hSlider, 'Value', 'PostSet', @(s, e) disp('hi')); 

Khi bạn di chuyển thanh trượt bạn sẽ thấy 'hi' được in ra màn hình (người nghe gọi lại), và khi bạn thả chuột bạn sẽ thấy 'hello' in (các uicontrol gọi lại).

+0

Cảm ơn, ví dụ này về cơ bản những gì tôi muốn làm. Tôi có một câu hỏi mặc dù; '@ (s, e)' làm gì trước hàm 'disp'? Tôi đoán '@' tạo ra xử lý để phân phối, nhưng '(s, e)' là gì? –

+2

@Bill: '@ (s, e)' tạo [chức năng ẩn danh] (http://www.mathworks.com/help/techdoc/matlab_prog/f4-70115.html) lấy làm đối số nhập 's' và 'e' và thực thi' disp (...) '. Sử dụng [hàm xử lý dưới dạng gọi lại] (http://www.mathworks.com/help/techdoc/creating_guis/f16-999606.html#f16-1001315) yêu cầu hàm này chấp nhận ít nhất hai đối số, ngay cả khi chúng không đã sử dụng. Các đối số này là xử lý của đối tượng phát hành cuộc gọi lại ('s') và dữ liệu sự kiện mà nó cung cấp tùy chọn (' e'). Tên mô tả hơn sẽ là 'hObject' và' eventData', nhưng tôi đã giữ mọi thứ ngắn gọn. – gnovice

4

Chỉ để lưu nội dung, chủ đề này được thảo luận chi tiết tại đây: http://UndocumentedMatlab.com/blog/continuous-slider-callback/ - một số giải pháp thay thế được trình bày ở đó. Giải pháp của gnovice sử dụng addlistener tương đương với handle.listener alternative, vì addlistener về cơ bản chỉ là một trình bao bọc cho phần sau.

0

Nếu bạn muốn thực hiện gọi lại ban đầu cùng bạn truyền cho uicontrol bạn có thể thêm người nghe chung chung này mà bootstraps gọi lại hiện:

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

Related blog post

Các vấn đề liên quan