如何在 MATLAB GUI 中通过滑块移动坐标轴上的垂直线?

3

我希望通过一个滑块来改变竖线的位置。代码如下。

function slider_wf_Callback(hObject, eventdata, handles)
% hObject    handle to slider_wf (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% Hints: get(hObject,'Value') returns position of slider
%        get(hObject,'Min') and get(hObject,'Max') to determine range of slider
global FLAG_DATA_LOADED;
if FLAG_DATA_LOADED == 1
    slider_value = int32(get(hObject,'Value'));
    set(handles.text_cur_frame_num, 'String',num2str(slider_value));

    axes(handles.axes_waveform);
    h = vline(slider_value/20, 'r-');
end
guidata(hObject, handles);

然而,当我移动滑块时,之前的线条仍然存在。如何解决这个问题?
感谢您的预先帮助。 图像示例

你是指调整时间轴的大小吗?我不明白你所说的“之前的行”是什么意思。 - ignacio
如果我第一次移动滑块,会出现一条红色的垂直线;但是如果我再次移动滑块,第一条线不会消失,第二条线也会出现。我希望只有一条线跟随着我移动滑块。 - meng dai
1个回答

1
我没有一个名为vline的函数,但是我假设它返回一个Line的句柄。你必须删除旧线并绘制新线或操作已经存在的线的位置。在这两种情况下,你都必须将句柄存储在某个地方。在GUIDE中,handles结构体用于此目的。
这是删除旧Line的解决方案:
if isfield(handles, 'myvline') % on the first run, no handle is available
    delete(handles.myvline);
end
handles.myvline = vline(slider_value/20, 'r-');

% ...

guidata(hObject, handles); % important, used to update the handles struct

通过操作现有的Line进行第二次尝试

if isfield(handles, 'myvline') % on the first run, no handle is available
    handles.myvline.XData(:) = slider_value/20;
else
    handles.myvline = vline(slider_value/20, 'r-');
end

% ...

guidata(hObject, handles); % important, used to update the handles struct

你的 try-catch 方法不起作用。我认为最好检查字段是否存在:if isfield(handles,'myvline')... - Rotem
只有在第二种情况下,但你是正确的!我已经更新了答案。 - Patrick Happel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接