如何在Matlab uipanel中捕获按键

时间:2014-11-04 20:49:53

标签: matlab user-interface input keyboard panel

如何在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,也会发生同样的事情。我担心我不得不诉诸涉及父母形象的某种黑客行为,如果可能的话,我想避免这种行为。

3 个答案:

答案 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指示相应编号对象的函数。指示对该对象或相关功能的进一步键盘输入。

这两种方法都不完美,我希望有一种方法可以避免通过这个图,但实际上这些方法并不是很复杂。我实际上同时使用它们。