如何在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
,也会发生同样的事情。我担心我不得不诉诸涉及父母形象的某种黑客行为,如果可能的话,我想避免这种行为。
答案 0 :(得分:1)
KeyPressedCallback
是底层Java对象的属性,而不是原始的Matlab uicontrol对象。要访问Matlab uicontrol的底层Java控件,您需要使用findjobj utility,因为我相信我在博客文章中解释过您引用的内容(您可能错过了这一关键步骤):
jPanel = findjobj(hPanel);
jPanel.KeyPressedCallback = @myMatlabCallbackFunc;
请注意,Matlab面板仅在HG2中成为基于Java的对象(R2014b,see here)。所以在R2014a和早期的Matlab版本中,你将无法使用这种技术,只能在其中一个较新的版本中使用。
答案 1 :(得分:0)
我没有看到您可以使用的任何回调属性或可以附加侦听器的事件。
>> events(h_panel)
Events for class matlab.ui.container.Panel:
ObjectBeingDestroyed
LocationChanged
SizeChanged
ButtonDown
Reset
PropertyAdded
PropertyRemoved
只是鼠标事件(ButtonDown
)和ButtonDownFcn
回调。也许还有其他一些技巧。问Yair Altman!
答案 2 :(得分:0)
最终,我发现这个问题有两个合理的解决方案,都涉及我最初所描述的“涉及父母形象的某种黑客攻击”。它们都需要在图中所谓的“活动”面板或对象的某种概念。
解决方案1
依靠最后点击的对象将图中的键盘输入定向到该对象。对图中需要键盘输入的每个对象使用ButtonDownFcn
。在回调中,将对象的句柄存储在图形的appdata中作为“活动”对象。 (类似于setappdata(h_fig, 'active_obj', h_obj
。)然后将图中的KeyPressFcn
设置为一个函数,该函数将从appdata和分支中获取该句柄。
解决方案2
使用某种按键方案来决定将哪个对象引导到其他输入。如果您有许多仅需要消除歧义的类似对象,则此方法很有效。例如,将图的KeyPressFcn
设置为使用键1-9指示相应编号对象的函数。指示对该对象或相关功能的进一步键盘输入。
这两种方法都不完美,我希望有一种方法可以避免通过这个图,但实际上这些方法并不是很复杂。我实际上同时使用它们。