我正在尝试创建一个GUI,它将接受多个输入并通过多个函数运行它们。我希望使用单选按钮面板在不同的图形之间切换,但我似乎无法让它工作。以下是我的代码示例。
switch get(eventdata.NewValue,'Tag') % Get Tag of selected object
case 'button1'
status1 = str2double(get(handles.button1,'Value'));
if status1 == 1;
axes(handles.axes1)
grid on;
plot(x1,y1)
end
case 'button2'
status2 = str2double(get(handles.button2,'Value'));
if status2 == 1;
axes(handles.axes1)
grid on;
plot(x2,y2)
end
case 'button3'
status3 = str2double(get(handles.button3,'Value'));
if status3 ==1
plot(x3,y3)
end
otherwise
% Code for when there is no match.
end
答案 0 :(得分:1)
您似乎试图以与radio button panel类似的方式创建this example tutorial on blinkdagger.com。具体来说,我相信您正在尝试创建SelectionChangeFcn来定义单选按钮如何修改GUI。我建议如下:
首先,我建议您在创建GUI时绘制所有线条,然后将线条的“可见”属性调整为“打开”或者不是在每次选择单选按钮时重新绘制一条线。 'off'取决于选择的按钮。创建GUI时,可以在代码中的某处添加这些行(在创建轴并将其放在handles
变量中之后):
handles = guidata(hObject); % Retrieve handles structure for GUI
set(handles.axes1,'NextPlot','add'); % Set axes to allow multiple plots
lineHandles = [plot(handles.axes1,x1,y1,'Visible','off') ...
plot(handles.axes1,x2,y2,'Visible','off') ...
plot(handles.axes1,x3,y3,'Visible','off')];
handles.lineHandles = lineHandles; % Update handles structure
guidata(hObject,handles); % Save handles structure
这将在同一轴上绘制三组线。这些线最初不可见,并且每个绘制线的句柄都收集在矢量变量lineHandles
中。上面的最后两行将句柄添加到句柄结构并更新GUI数据(hObject
应该是GUI图窗口的句柄!)。
现在,您可以将以下内容用于SelectionChangeFcn:
handles = guidata(hObject); % Retrieve handles structure for GUI
buttonTags = {'button1' 'button2' 'button3'};
if ~isempty(eventdata.OldValue), % Check for an old selected object
oldTag = get(eventdata.OldValue,'Tag'), % Get Tag of old selected object
index = strcmp(oldTag,buttonTags); % Find index of match in buttonTags
set(handles.lineHandles(index),'Visible','off'); % Turn old line off
end
newTag = get(eventdata.NewValue,'Tag'), % Get Tag of new selected object
index = strcmp(newTag,buttonTags); % Find index of match in buttonTags
set(handles.lineHandles(index),'Visible','on'); % Turn new line on
guidata(hObject,handles); % Save handles structure
注意:如果您想要更改绘制的三行中的任何一行,只需设置其中一个行句柄的“XData”和“YData”属性即可。例如,这会使用新的x和y数据更新第一个绘制的线:
set(handles.lineHandles(1),'XData',xNew,'YData',yNew);
答案 1 :(得分:0)
除非你有充分的理由不这样做,否则我认为你应该将绘图代码放在每个单选按钮的回调中。
无需做这个大型开关站。
% --- Executes on button press in radiobutton1.
function radiobutton1_Callback(hObject, eventdata, handles)
% hObject handle to radiobutton1 (see GCBO)
% eventdata reserved - to be defined in a future version of MATLAB
% handles structure with handles and user data (see GUIDATA)
% Hint: get(hObject,'Value') returns toggle state of radiobutton1
%%
%get the values of x y into this callback as you see fit
plot(x,y)
此外,按钮出来的'值'已经是单选按钮的两倍。无需像你一样进行转换。