【发布时间】:2014-10-14 16:43:58
【问题描述】:
我目前正在 Matlab GUI 中构建一个功能,用户可以更改屏幕上显示的绘图(通过弹出菜单......这不是问题,仅供参考!)并移动垂直线用鼠标穿过绘图(x 数据从这条线的位置返回)。首次生成 GUI 时创建此鼠标交互线没有问题,但一旦用户从弹出菜单中选择不同的数据集,就无法“重新生成”用户交互线。
我在GUI的打开函数中使用以下代码建立可拖动线:
handles.yline1 = line([x_start x_start],[y_min,y_max],'ButtonDownFcn',@(hObject,eventdata)postprocessingtry1('startdrag1_Fcn',hObject,eventdata,guidata(hObject)));
地点:
function startdrag1_Fcn(hObject, eventdata, handles)
set(handles.figure2,'WindowButtonMotionFcn',@(hObject,eventdata)postprocessingtry1('dragging1_Fcn',hObject,eventdata,guidata(hObject)));
...而“dragging1_Fcn”是返回x位置的函数。
一旦我尝试在弹出菜单回调函数中使用相同的“handles.yline1 = ...”声明,就会发生错误:
使用 handle.handle/set 时出错 对象无效或已删除。
后处理出错try1>dragging1_Fcn(第341行)
set(handles.yline1,'XData',pt.CurrentPoint(1,1)*[1 1]);
任何关于在选择和绘制新数据集(通过弹出菜单)后如何重新生成用户交互线的建议将不胜感激。现在想来,我觉得可能在弹出菜单回调函数中引用hObject和eventdata可能与问题有关……但我不确定!
感谢您的宝贵时间,科林沃尔多
【问题讨论】:
-
你的回调函数声明对我来说是模糊的。为什么不简单地
handles.yline1 = line(...,'ButtonDownFcn',@startdrag1_Fcn);?每次定义回调函数时都有理由调用postprocessingtry1吗? -
同意@Hoki。否则,作为一个想法,您可以使用 'findobj('Type','Line')' 来获取当前在绘图上的线。如果它是空的,那么创建另一个?我现在无法对其进行测试,但这可能是一个开始。
标签: matlab user-interface matlab-guide