1

複数の入力を取り、それらを複数の関数で実行する 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
4

2 に答える 2

1

この例のチュートリアルと同様の方法で、ラジオ ボタン パネルを作成しようとしているようです。具体的には、SelectionChangeFcnを作成して、ラジオ ボタンが GUI を変更する方法を定義しようとしていると思います。次のことをお勧めします。

まず、ラジオ ボタンが選択されるたびに線を再プロットする代わりに、GUI を作成するときにすべての線をプロットし、線の「表示」プロパティを「オン」または「オフ」に調整することをお勧めします。どのボタンが選択されているかによって異なります。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

これにより、同じ軸上に 3 セットの線がプロットされます。これらの線は最初は表示されず、プロットされた各線のハンドルがベクトル変数に収集されますlineHandles。上記の最後の 2 行は、ハンドル構造にライン ハンドルを追加し、GUI データを更新します ( hObjectGUI フィギュア ウィンドウへのハンドルである必要があります!)。

これで、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

注:プロットされている 3 つの線のいずれかを変更したい場合は、線ハンドルの 1 つの 'XData' および 'YData' プロパティを設定するだけです。例として、これは最初にプロットされたラインを新しい x および y データで更新します。

set(handles.lineHandles(1),'XData',xNew,'YData',yNew);
于 2009-07-21T01:42:00.853 に答える
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)

また、ボタンから出てくる「値」は、ラジオボタンの場合はすでに倍になっています。あなたがやっているようにそれを変換する必要はありません。

于 2009-07-20T20:45:49.933 に答える