Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

GUIDE でのコールバックの作成

メモ

GUIDE 環境は将来のリリースで削除される予定です。既存の GUIDE アプリは、GUIDE が削除された後も引き続き MATLAB® で動作しますが、GUIDE での編集はできません。

既存の GUIDE アプリを引き続き編集するには、将来の MATLAB リリースとの互換性維持に役立つ方法について、GUIDE の移行策を参照してください。新しいアプリを対話的に作成する場合は、代わりにApp Designer を使用したアプリ開発を参照してください。

異なるユーザー操作用のコールバック

UI とグラフィックスのコンポーネントのプロパティには、特定のコールバック関数に関連付けできるものがあります。これらのプロパティはそれぞれ、特定のユーザー操作に対応します。たとえば、uicontrol には、Callback と呼ばれるプロパティがあります。このプロパティの値は、コールバック関数へのハンドル、無名関数、または MATLAB 式を含む文字ベクトルとして設定できます。このプロパティを設定すると、uicontrol を操作するときにアプリが応答するようになります。Callback プロパティに値が指定されていない場合、ユーザーが uicontrol を操作しても何も起きません。

次の表に、使用可能なコールバック プロパティ、コールバック関数をトリガーするユーザー操作、それらのプロパティを使用する一般的な UI コンポーネントとグラフィックス コンポーネントの一覧を示します。

コールバック プロパティ

ユーザー アクション

このプロパティを使用するコンポーネント

ButtonDownFcn

ポインターがコンポーネント上または Figure 上にあるときにエンド ユーザーがマウス ボタンをクリックする。

axes, figure, uibuttongroup, uicontrol, uipanel, uitable,

Callback

エンド ユーザーがコンポーネントをトリガーする。以下に例を示します。メニュー項目の選択、スライダーの移動、プッシュ ボタンの押し下げ。

uicontextmenu, uicontrol, uimenu

CellEditCallback

エンド ユーザーがテーブル内にある編集可能なセルの値を編集する。

uitable

CellSelectionCallback

エンド ユーザーがテーブル内のセルを選択する。

uitable

ClickedCallback

エンド ユーザーがマウスの左ボタンでプッシュ ツールまたはトグル ツールをクリックする。

uitoggletool, uipushtool

CloseRequestFcn

Figure が閉じる。

figure

CreateFcn

MATLAB がオブジェクトを作成し、そのオブジェクトが表示される前にコールバックが実行される。

axes, figure, uibuttongroup, uicontextmenu, uicontrol, uimenu, uipushtool, uipanel, uitable, uitoggletool, uitoolbar

DeleteFcn

MATLAB が Figure を削除する直前にコールバックが実行される。

axes, figure, uibuttongroup, uicontextmenu, uicontrol, uimenu, uipushtool, uipanel, uitable, uitoggletool, uitoolbar

KeyPressFcn

ポインターがオブジェクト上にあるときにエンド ユーザーがキーボードのキーを押す。

figure, uicontrol, uipanel, uipushtool, uitable, uitoolbar

KeyReleaseFcn

ポインターがオブジェクト上にあるときにエンド ユーザーがキーボードのキーを離す。

figure, uicontrol, uitable

OffCallback

トグル ツールの State'off' に変わると実行される。

uitoggletool

OnCallback

トグル ツールの State'on' に変わると実行される。

uitoggletool

SizeChangedFcn

Resize プロパティが 'on' に設定されているボタン グループ、Figure またはパネルのサイズをエンド ユーザーが変更する。

figure, uipanel, uibuttongroup

SelectionChangedFcn

エンド ユーザーが、ボタン グループ内にある別のラジオ ボタンやトグル ボタンを選択する。

uibuttongroup

WindowButtonDownFcn

ポインターが Figure ウィンドウ内にあるときにエンド ユーザーがマウス ボタンをクリックする。

figure

WindowButtonMotionFcn

エンド ユーザーが Figure ウィンドウ内でポインターを移動する。

figure

WindowButtonUpFcn

エンド ユーザーがマウス ボタンを離す。

figure

WindowKeyPressFcn

ポインターが Figure 上またはその子オブジェクト上にあるときにエンド ユーザーがキーを押す。

figure

WindowKeyReleaseFcn

ポインターが Figure 上またはその子オブジェクト上にあるときにエンド ユーザーがキーを離す。

figure

WindowScrollWheelFcn

ポインターが Figure 上にあるときにエンド ユーザーがマウス ホイールを回す。

figure

GUIDE が生成するコールバック関数とプロパティ値

GUIDE がコールバック関数とプロパティを管理する方法

UI に uicontroluimenu または uicontextmenu のコンポーネントを追加すると、UI を保存する前に GUIDE は Callback プロパティに値 %automatic を指定します。この値は、GUIDE がコールバック関数の名前を生成することを示します。

UI の保存時に、GUIDE はコード ファイルに空のコールバック関数定義を追加し、コントロールの Callback プロパティを無名関数として設定します。次の関数の定義は、プッシュ ボタンについて GUIDE が生成するコールバック関数の例です。

function pushbutton1_Callback(hObject,eventdata,handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

end
この UI に myui という名前を付けて保存すると、GUIDE はプッシュ ボタンの Callback プロパティに次の値を設定します。
@(hObject,eventdata)myui('pushbutton1_Callback',hObject,eventdata,guidata(hObject))
これは、関数 pushbutton1_Callback の参照として機能する無名関数です。この無名関数には入力引数が 4 つあります。最初の引数は、コールバック関数の名前です。残り 3 つの引数は MATLAB によって指定されるもので、GUIDE コールバックの構文で説明しています。

メモ

テーブル、パネル、ボタン グループなどのその他の UI コンポーネントについて、GUIDE はコールバック関数を自動生成しません。これらのコンポーネントのいずれかからコールバック関数を実行する場合は、コールバックを作成しなければなりません。このためには、レイアウト内のコンポーネントを右クリックし、コンテキスト メニューの [コールバックの表示] から項目を選択します。

GUIDE コールバックの構文

コールバックはすべて、少なくとも 3 つの入力引数を受け取らなければなりません。

  • hObject — コールバックをトリガーした UI コンポーネント

  • eventdata — 特定のマウスやキーボード操作についての詳細情報を含む変数

  • handles — UI 内のすべてのオブジェクトを含む struct。GUIDE は、関数 guidata を使用してこの構造体を保存し維持します。

コールバック関数が追加の引数を受け取るようにするには、関数定義の引数リストの最後に追加の引数を指定しなければなりません。

eventdata 引数

eventdata 引数は、特定のコールバック関数に詳細情報を表示します。たとえば、ユーザーが KeyPressFcn をトリガーした場合、MATLAB はエンド ユーザーが押した特定のキー (またはキーの組み合わせ) に関する情報を表示します。コールバック関数で使用できる eventdata がない場合、MATLAB はこれを空の配列として渡します。次の表に、eventdata を使用するコールバックとコンポーネントを示します。

コールバックのプロパティ名コンポーネント
WindowKeyPressFcn
WindowKeyReleaseFcn
WindowScrollWheel
figure
KeyPressFcnfigure, uicontrol, uitable
KeyReleaseFcnfigure, uicontrol, uitable
SelectionChangedFcnuibuttongroup
CellEditCallback
CellSelectionCallback
uitable

GUIDE コールバック間のデータ共有

アプリ内で相互依存するコントロール、メニュー、グラフィックス オブジェクトを作成するには、コンポーネントにアクセスする必要のあるアプリの各部分と明示的にデータを共有しなければなりません。

方法説明要件とトレードオフ
UserData の共有

コンポーネント オブジェクトを使用して、直接プロパティ値を取得または設定します。

すべての UI コンポーネントには、任意の MATLAB データを格納できる UserData プロパティがあります。

  • プロパティを設定または取得するには、そのコンポーネントにアクセスできる必要があります。

  • UserData が一度に保持できる変数は 1 つのみですが、複数の値を struct 配列または cell 配列として格納できます。

アプリケーション データの共有

関数 setappdata を使用して、特定のコンポーネントにデータを関連付けます。後で関数 getappdata を使用して、そのコンポーネントにアクセスできます。

  • アプリケーション データを設定または取得するには、そのコンポーネントにアクセスできる必要があります。

  • 複数の変数を共有できます。

guidata の使用

関数 guidata を使用して、データを Figure ウィンドウと共有します。

  • 任意の UI コンポーネントを使用してデータの格納や取得を行います。

  • 一度に格納できる変数は 1 つのみですが、複数の値を struct 配列または cell 配列として格納できます。

GUIDE アプリでの UserData の共有

UI コンポーネントのプロパティには、役立つ情報が含まれています。たとえば、Value プロパティをクエリすると、スライダーの現在の位置がわかります。さらに、すべてのコンポーネントに UserData プロパティがあり、ここに任意の MATLAB 変数を格納できます。コールバック関数がコンポーネントにアクセスできる限り、すべてのコールバック関数は UserData プロパティに格納された値にアクセスできます。

スライダーのデータを UserData プロパティと共有するように GUIDE アプリを設定するには、次の手順を実行します。

  1. コマンド ウィンドウで「guide」と入力し、新しい空白の GUI を開きます。

  2. 以下の手順に従って、コンポーネント パレットに UI コンポーネントの名前を表示します。

    1. [ファイル][基本設定][GUIDE] を選択します。

    2. [コンポーネント パレットに名前を表示] をオンにします。

    3. [OK] をクリックします。

  3. レイアウト エディターの左のコンポーネント パレットから [プッシュ ボタン] ツールを選択し、レイアウト領域にドラッグします。

  4. レイアウト エディターの左のコンポーネント パレットから [スライダー] ツールを選択し、レイアウト領域にドラッグします。

  5. [ファイル][保存] を選択します。UI を myslider.fig として保存します。MATLAB で、コード ファイルがエディターで開きます。

  6. オープニング関数 myslider_OpeningFcnUserData プロパティの初期値を設定します。この関数は、UI がユーザーに対して表示可能になる直前に実行されます。

    myslider_OpeningFcn 内の handles.output = hObject コマンドの直後に以下のコマンドを挿入します。

    data = struct('val',0,'diffMax',1);
    set(handles.slider1,'UserData',data);
    
    コマンドを追加した後、myslider_OpeningFcn は次のようになります。
    function myslider_OpeningFcn(hObject, eventdata, handles, varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to junk (see VARARGIN)
    
    % Choose default command line output for myslider
    handles.output = hObject;
    data = struct('val',0,'diffMax',1);
    set(handles.slider1,'UserData',data);
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes myslider wait for user response
    % uiwait(handles.figure1);
    
    handlesmyslider_OpeningFcn への入力引数である点に注意してください。変数 handles は、UI 内のすべてのコンポーネントを含む構造体です。この構造体の各フィールドは個々のコンポーネントに対応しています。各フィールド名は、対応するコンポーネントの Tag プロパティに一致します。したがって、handles.slider1 は、この UI 内のスライダー コンポーネントです。コマンド set(handles.slider1,'UserData',data) は、変数 data をスライダーの UserData プロパティに格納します。

  7. スライダー コールバックに、データを変更するためのコードを追加します。以下のコマンドを、関数 slider1_Callback の末尾に追加します。

    maxval = get(hObject,'Max');  
    sval = get(hObject,'Value');  
    diffMax = maxval - sval;   
    data = get(hObject,'UserData');
    data.val = sval;
    data.diffMax = diffMax;
    % Store data in UserData of slider
    set(hObject,'UserData',data);
    コマンドを追加した後、slider1_Callback は次のようになります。
    % --- Executes on slider movement.
    function slider1_Callback(hObject, eventdata, handles)
    % hObject    handle to slider1 (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
    maxval = get(hObject,'Max');  
    sval = get(hObject,'Value');  
    diffMax = maxval - sval;   
    data = get(hObject,'UserData');
    data.val = sval;
    data.diffMax = diffMax;
    % Store data in UserData of slider
    set(hObject,'UserData',data);
    
    hObject が関数 slider1_Callback の入力引数である点に注意してください。hObject は、常にコールバックをトリガーするコンポーネント (この例ではスライダー) です。したがって、set(hObject,'UserData',data) は、変数 data をスライダーの UserData プロパティに格納します。

  8. プッシュ ボタン コールバックに、データを取得するためのコードを追加します。以下のコマンドを、関数 pushbutton1_Callback の末尾に追加します。

    % Get UserData from the slider
    data = get(handles.slider1,'UserData');
    currentval = data.val;
    diffval = data.diffMax;
    display([currentval diffval]);
    コマンドを追加した後、pushbutton1_Callback は次のようになります。

    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Get UserData from the slider
    data = get(handles.slider1,'UserData');
    currentval = data.val;
    diffval = data.diffMax;
    display([currentval diffval]);

    このコードは、handles 構造体を使用してスライダーにアクセスします。コマンド data = get(handles.slider1,'UserData') は、スライダーの UserData プロパティを取得します。その後、関数 display が格納された値を表示します。

  9. エディターのツールストリップで [保存] を押して、コードを保存します。

GUIDE アプリでのアプリケーション データの共有

アプリケーション データを格納するには、関数 setappdata を次のように呼び出します。

setappdata(obj,name,value);
最初の入力 obj は、データを格納するコンポーネント オブジェクトです。2 番目の入力 name は、値を記述するフレンドリ名です。3 番目の入力 value は、格納する値です。

アプリケーション データを取得するには、関数 getappdata を次のように使用します。

data = getappdata(obj,name);
コンポーネント obj は、データを含むコンポーネント オブジェクトでなければなりません。2 番目の入力 name は、データの格納時に使用した名前と一致しなければなりません。変数を 1 つだけもつ UserData プロパティとは異なり、setappdata を使用すると複数の変数を格納できます。

アプリケーション データを共有するように GUIDE アプリを設定するには、次の手順を実行します。

  1. コマンド ウィンドウで「guide」と入力し、新しい空白の GUI を開きます。

  2. 以下の手順に従って、コンポーネント パレットに UI コンポーネントの名前を表示します。

    1. [ファイル][基本設定][GUIDE] を選択します。

    2. [コンポーネント パレットに名前を表示] をオンにします。

    3. [OK] をクリックします。

  3. レイアウト エディターの左のコンポーネント パレットから [プッシュ ボタン] ツールを選択し、レイアウト領域にドラッグします。

  4. レイアウト エディターの左のコンポーネント パレットから [スライダー] ツールを選択し、レイアウト領域にドラッグします。

  5. [ファイル][保存] を選択します。UI を myslider.fig として保存します。MATLAB で、コード ファイルがエディターで開きます。

  6. オープニング関数 myslider_OpeningFcn にアプリケーション データの初期値を設定します。この関数は、UI がユーザーに対して表示可能になる直前に実行されます。myslider_OpeningFcn 内の handles.output = hObject コマンドの直後に以下のコマンドを挿入します。

    setappdata(handles.figure1,'slidervalue',0); 
    setappdata(handles.figure1,'difference',1);
    コマンドを追加した後、myslider_OpeningFcn は次のようになります。
    function myslider_OpeningFcn(hObject,eventdata,handles,varargin)
    % This function has no output args, see OutputFcn.
    % hObject    handle to figure
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    % varargin   command line arguments to junk (see VARARGIN)
    
    % Choose default command line output for junk
    handles.output = hObject;
    setappdata(handles.figure1,'slidervalue',0); 
    setappdata(handles.figure1,'difference',1);
    
    % Update handles structure
    guidata(hObject, handles);
    
    % UIWAIT makes junk wait for user response (see UIRESUME)
    % uiwait(handles.figure1);
    
    handlesmyslider_OpeningFcn への入力引数である点に注意してください。変数 handles は、UI 内のすべてのコンポーネントを含む構造体です。この構造体の各フィールドは個々のコンポーネントに対応しています。各フィールド名は、対応するコンポーネントの Tag プロパティに一致します。この場合、handles.figure1 が figure オブジェクトです。したがって、setappdata は、この figure オブジェクトを使用してデータを格納できます。

  7. スライダー コールバックに、データを変更するためのコードを追加します。以下のコマンドを、関数 slider1_Callback の末尾に追加します。

    maxval = get(hObject,'Max');  
    currval = get(hObject,'Value');  
    diffMax = maxval - currval;   
    % Store application data
    setappdata(handles.figure1,'slidervalue',currval); 
    setappdata(handles.figure1,'difference',diffMax);
    コマンドを追加した後、slider1_Callback は次のようになります。
    function slider1_Callback(hObject, eventdata, handles)
    % hObject    handle to slider1 (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
    maxval = get(hObject,'Max');  
    currval = get(hObject,'Value');  
    diffMax = maxval - currval;   
    % Store application data
    setappdata(handles.figure1,'slidervalue',currval); 
    setappdata(handles.figure1,'difference',diffMax);
    このコールバック関数は handles 構造体にアクセスできるため、setappdata コマンドはデータを handles.figure1 に格納します。

  8. プッシュ ボタン コールバックに、データを取得するためのコードを追加します。以下のコマンドを、関数 pushbutton1_Callback の末尾に追加します。

    % Retrieve application data
    currentval = getappdata(handles.figure1,'slidervalue');
    diffval = getappdata(handles.figure1,'difference');
    display([currentval diffval]);
    コマンドを追加した後、pushbutton1_Callback は次のようになります。
    % --- Executes on button press in pushbutton1.
    function pushbutton1_Callback(hObject, eventdata, handles)
    % hObject    handle to pushbutton1 (see GCBO)
    % eventdata  reserved - to be defined in a future version of MATLAB
    % handles    structure with handles and user data (see GUIDATA)
    
    % Retrieve application data
    currentval = getappdata(handles.figure1,'slidervalue');
    diffval = getappdata(handles.figure1,'difference');
    display([currentval diffval]);
    このコールバック関数は handles 構造体にアクセスできるため、getappdata コマンドは handles.figure1 からデータを取得します。

  9. エディターのツールストリップで [保存] を押して、コードを保存します。

GUIDE アプリでの guidata を使用したデータの保存および共有

GUIDE では、関数 guidata を使用して、すべての UI コンポーネントを含む handles と呼ばれる構造体を格納します。配列 handles は MATLAB で各コールバック関数に渡されます。追加データを共有するために guidata を使用する場合は、オープニング関数の handles 構造体にフィールドを追加します。オープニング関数は、名前に _OpeningFcn を含むコード ファイルの先頭付近で定義される関数です。

コールバック関数のデータを変更するには、handles 構造体を変更してから、関数 guidata を使用してその構造体を格納します。次のスライダーのコールバック関数は、GUIDE コールバック関数内で handles 構造体を変更して格納する方法を示します。

function slider1_Callback(hObject, eventdata,handles)
% hObject   handle to slider1 (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
	handles.myvalue = 2;
	guidata(hObject,handles);
end 

GUIDE の例: guidata を使用したスライダー データの共有

ここでは、関数 guidata を使用してスライダーとテキスト フィールド間でデータを共有する、プリビルドの GUIDE アプリを示します。スライダーを動かすと、テキスト フィールドに表示された数字が変化し、新しいスライダーの位置を示します。

GUIDE の例: 2 つのアプリ間でのデータの共有

ここでは、アプリケーション データと関数 guidata を使用して 2 つのダイアログ ボックス間でデータを共有する、プリビルドの GUIDE アプリを示します。2 番目のダイアログ ボックスにテキストを入力して [OK] をクリックすると、最初のダイアログ ボックスのボタン ラベルが変わります。

changeme_main.m では、関数 buttonChangeMe_Callback がこのコマンドを実行して 2 つ目のダイアログ ボックスを表示します。

changeme_dialog('changeme_main', handles.figure)

handles.figure 入力引数は、[changeme_main] ダイアログ ボックスの Figure オブジェクトです。

関数 changeme_dialogFigure オブジェクトから handles 構造体を取得します。したがって、[changeme_main] ダイアログ ボックスのすべてのコンポーネントを 2 つ目のダイアログ ボックスから使用できます。

GUIDE の例: 3 つのアプリ間でのデータの共有

ここでは、guidata および UserData を使用して 3 つのアプリ ウィンドウ間でデータを共有する、プリビルドの GUIDE アプリを示します。大きなウィンドウはアイコンのエディターで、ツール パレットおよびカラー パレットのウィンドウからの情報を受け取ります。

guide_inconeditor.m では、関数 guide_iconeditor_OpeningFcn に次のコマンドが含まれています。

colorPalette = guide_colorpalette('iconEditor', hObject)

引数は、次のようになります。

  • 'iconEditor' は、関数の実行でトリガーされる guide_iconEditor ウィンドウのコールバックを指定します。

  • hObject は、guide_iconEditor ウィンドウの Figure オブジェクトです。

  • colorPalette は、guide_colorPalette ウィンドウの Figure オブジェクトです。

同様にして、guide_iconeditor_OpeningFcn は、同じような入力引数と出力引数をもつ関数 guide_toolpalette を呼び出します。

これらの関数間で Figure オブジェクトを渡すことにより、guide_iconEditor ウィンドウで他の 2 つのウィンドウの handles 構造体にアクセスすることが可能になります。また、他の 2 つのウィンドウでも guide_iconEditor ウィンドウの handles 構造体にアクセスできます。

GUIDE が生成するコールバックの名前変更と削除

コールバックの名前の変更

GUIDE はコンポーネントの Tag プロパティとコールバックのプロパティ名を組み合わせて、コールバック関数の名前を作成します。コンポーネントの Tag 値を変更すると、次回の UI の保存時に GUIDE がコールバックの名前を変更します。

UI を保存した後に Tag 値を変更する場合、GUIDE は次の項目を更新します (すべてのコンポーネントが一意の Tag 値をもつと仮定)。

  • コンポーネントのコールバック関数の定義

  • コンポーネントのコールバック プロパティの値

  • handles 構造体の対応するフィールドを指すコード ファイル内の参照

コンポーネントの Tag プロパティを変更せずにコールバック関数の名前を変更するには、次の手順に従います。

  1. コールバック関数定義内の名前を変更します。

  2. 無名関数に渡す最初の引数を変更して、コンポーネントのコールバック プロパティを更新します。たとえば、プッシュ ボタンの元のコールバック プロパティは次のようになっています。

    @(hObject,eventdata)myui('pushbutton1_Callback',...
                               hObject,eventdata,guidata(hObject))

    この例では、'pushbutton1_Callback' を新しい関数名に変更しなければなりません。

  3. コード ファイル内で、古い関数名を指すその他すべての参照を変更して、新しい関数名を指すようにします。

コールバックの削除

エンド ユーザーが特定の操作を行ったときに実行される関数の削除または変更を行う場合、コールバック関数を削除できます。コールバック関数を削除するには、次の手順に従います。

  1. コード内にあるコールバック関数を参照するすべてのインスタンスを検索し、置き換えします。

  2. GUIDE で UI を開き、プロパティ インスペクターを使用して、コールバック関数を参照するすべてのインスタンスを置き換えます。

  3. コールバック関数を削除します。

関連するトピック