質問
double 型のハンドルのイベントとプロパティのリストを , として取得するにはどうすればよいfigure
ですaxes
か?
問題
Matlab のドキュメントでは、インターフェイスで何が起こってもリッスンするために 、 などWindowButtonDownFcn
を使用するように指示されています。WindowButtonMotionFcn
問題は、このプロパティが次の事実として非常に制限されていることです。
変数をスコープ内に保つ
MATLAB が関数ハンドルを評価するとき、関数ハンドルが作成されたときと同じ変数がスコープ内にあります。(対照的に、文字列として指定されたコールバックは、ベース ワークスペースで評価されます。)これにより、オブジェクト ハンドルなどのグローバル データを GUI で管理するプロセスが簡素化されます。
はい、ButtonDownFcn からコールバックを再定義、追加、または削除する必要がない場合、これは完璧です。これを行うと、新しいスコープでそれらを宣言しているため、他の関数ハンドル変数スコープが失われるためです。必要な変数が含まれていない可能性があります。
したがって、1 つの方法は、イベントがアクティブ化されたときに呼び出されるプロパティではなく、イベント自体をリッスンすることです。そうすることで、わざわざ ButtonDownFcn を再宣言したり、変数をスコープに保持したりする必要がなくなります。他のソリューションは実装が非常に遅いです。. handle.listener
またはaddlistener
matlab リスニング ツールを使用するように、イベントを直接リッスンできれば、それを気にする必要はありません。
すでに知られている 1 つの優れたアプローチ
最善の解決策の 1 つは、この FEXであり、これは弱い matlabWindowButtonDownFcn
と、WindowButtonDownFcn
「リスナー」関数 matlab が持つすべてのプロパティを強化するため、グラフィカル インターフェイスで変更をリッスンする任意の量の関数を使用できます。他の関数ハンドルはスコープ変数を失います。
これにより、すべてがラップされるため、matlab イベントを取得する必要はありません。しかし、matlab がユーザーに、より良いアプローチを文書化する代わりに壊れた機能を使用するように導き、人々が物事を本来あるべきように使用できるようにすべてをラップするように導くことは、私を楽しませてくれます。
役に立つかもしれない情報。
meta.class
クラスが持つすべてのプロパティ、イベントなどを提供するについて知っています。私が持っている1つのクラスの場合、それは a から継承しますhandle
:
>> EventMeta = ?Event
EventMeta =
class with properties:
Name: 'Event'
Description: ''
DetailedDescription: ''
Hidden: 0
Sealed: 0
Abstract: 0
ConstructOnLoad: 0
HandleCompatible: 1
InferiorClasses: {0x1 cell}
ContainingPackage: []
PropertyList: [64x1 meta.property]
MethodList: [29x1 meta.method]
EventList: [2x1 meta.event]
EnumerationMemberList: [0x1 meta.EnumeratedValue]
SuperclassList: [1x1 meta.class]
Event
そのメタを使用して、次のクラスから EventList を取得できます。
>> EventMeta.EventList.Name
ans =
attemptToClick
ans =
ObjectBeingDestroyed
この場合、これはそれほど素晴らしいことではありません。なぜなら、私はそれを実装しており、ソースがあるため、それが持つイベントを知っているからです。問題は、a のメタクラスを取得figure
できれば (それが可能であれば)、Events
matlab で利用できる場合は実装されたものにアクセスできるということです。