如何在Matlab uipanel中捕获按键
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Matlab uipanel中捕获按键相关的知识,希望对你有一定的参考价值。
如何捕获uipanel内的键盘输入,即面板中的任何东西有焦点?我发现uipanel
没有KeyPressFcn
属性。我从Undocumented Matlab中读到了关于Java回调的this post,但我也无法让KeyPressedCallback
工作。例如,如果我尝试这样做:
set(h_panel, 'KeyPressFcn', @(src, event)key_press(obj, src, event));
我收到此错误:
The name 'KeyPressFcn' is not an accessible property for an instance of class 'uicontrol'.
如果我尝试KeyPressedCallback
,同样的事情发生。我担心我不得不诉诸涉及父母形象的某种黑客行为,如果可能的话我想避免。
KeyPressedCallback
是底层Java对象的属性,而不是原始的Matlab uicontrol对象。要访问Matlab uicontrol的底层Java控件,你需要使用findjobj utility,因为我相信我在我的博客文章中解释过你引用了(你可能错过了那个关键步骤):
jPanel = findjobj(hPanel);
jPanel.KeyPressedCallback = @myMatlabCallbackFunc;
请注意,Matlab面板仅在HG2(R2014b,see here)中成为基于Java的对象。因此,在R2014a和更早版本的Matlab版本中,您将无法使用此技术,只能在其中一个较新的版本上使用。
我没有看到您可以使用的任何回调属性或可以附加侦听器的事件。
>> events(h_panel)
Events for class matlab.ui.container.Panel:
ObjectBeingDestroyed
LocationChanged
SizeChanged
ButtonDown
Reset
PropertyAdded
PropertyRemoved
只是鼠标事件(ButtonDown
)和ButtonDownFcn
回调。也许还有其他一些技巧。问Yair Altman!
最后,我发现这个问题有两个合理的解决方案,都涉及我最初所描述的“涉及父母形象的某种黑客”。它们都需要在所讨论的图中的“活动”面板或对象的某种概念。
解决方案1
依靠最后点击的对象将图中的键盘输入定向到该对象。对图中需要键盘输入的每个对象使用ButtonDownFcn
。在回调中,将对象的句柄存储在图形的appdata中作为“活动”对象。 (像setappdata(h_fig, 'active_obj', h_obj
那样。)然后将图中的KeyPressFcn
设置为一个函数,该函数将从appdata和branch中获取该句柄。
解决方案2
使用某种按键方案来决定将哪个对象引导到其他输入。如果您有许多仅需要消除歧义的类似对象,则此方法很有效。例如,将图的KeyPressFcn
设置为使用1-9键指示相应编号对象的函数。直接进一步键盘输入到该对象或相关功能。
这两种方法都不是完美的,我希望有一种方法可以避免通过这个图,但实际上这些方法并不是很复杂。我实际上同时使用它们。
以上是关于如何在Matlab uipanel中捕获按键的主要内容,如果未能解决你的问题,请参考以下文章