如何在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中捕获按键的主要内容,如果未能解决你的问题,请参考以下文章

matlab设计uipanel

jQuery:如何在文本框中捕获 TAB 按键

如何在matlab中从nifti图像中逐片写入?

如何在 GtkEntry 中捕获 Enter 按键

uniGUI 应用捕获按键

SwiftUI iOS - 如何使用捕获的硬件按键事件