2009-07-20 3 views
1

Я пытаюсь создать графический интерфейс, который будет принимать несколько входов и запускать их через несколько функций. Я хочу использовать панель переключателей для переключения между разными графиками, но я просто не могу заставить ее работать. Вот пример моего кода.Использование панели переключателей для выбора различных вариантов графического отображения

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 
+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) 

Кроме того, «значение», которое выходит из кнопки, уже является двойным для переключателей. Не нужно преобразовывать его, как вы делаете.

1

похоже, что вы пытаетесь создать radio button panel способом, аналогичным this example tutorial on blinkdagger.com. В частности, я считаю, что вы пытаетесь создать SelectionChangeFcn, чтобы определить, как переключатели изменят ваш графический интерфейс. Я бы предложил следующее:

Прежде всего, вместо того, чтобы подбирать строку каждый раз при выборе переключателя, я предлагаю вам построить все ваши строки при создании графического интерфейса пользователя, а затем отредактировать свойство «Видимый» в зависимости от того, какая кнопка выбрана. Когда вы сделаете свой графический интерфейс, вы можете добавить эти строки где-то в коде (после осей создаются и помещаются в переменной 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. Последние две строки выше добавляют ручки строк в структуру дескрипторов и обновляют данные графического интерфейса (hObject должен быть дескриптором окна с графическим интерфейсом!).

Теперь вы можете использовать следующие для 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); 
Смежные вопросы