【问题标题】:How to capture key press in Matlab uipanel如何在 Matlab uipanel 中捕获按键
【发布时间】:2014-12-31 21:51:39
【问题描述】:

如何在 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,也会发生同样的事情。恐怕我不得不求助于某种涉及父图的黑客行为,如果可能的话,我想避免这种做法。

【问题讨论】:

  • 在面板被选中并且可以接收按键的意义上,面板是否可以“活动”?显然有一个按钮(鼠标)事件,但没有按键...
  • @chappjc 是对的,面板在其他 uicontrol 的意义上是不活动的。您可以尝试拦截 figure KeyPressFcn 中的按键事件,然后检查您的鼠标当时是否在 uipanel 上方(或者具有焦点的控件是否是您的 child面板)。如果是的话,做你的事情。如果否,则丢弃按键事件或将其传递给其他图形侦听器。
  • 好吧,我想避免诉诸父图形回调,但我想另一种方法可能是为 uipanel 内的每个 uicontrol 设置回调。但是axes和lineseries真的也没有KeyPressFcn!?
  • 您是否找到了解决方案,或者确实没有KeyPressFcn 或其他您可以收听的回调属性? (看起来是这样,正如我在回答中提到的那样,但没有可用的东西似乎有点奇怪)。
  • @chappjc,我还没有找到真正的解决方案。短期的想法是有一种方法来决定哪个面板/对象是最后选择或使用的,并在那里发送回调。这对我来说现在很好,但将来我可能需要设计一个更完整的解决方案,这就是我没有积极更新这个问题的原因。

标签: matlab user-interface input keyboard panel


【解决方案1】:

KeyPressedCallback 是底层 Java 对象的属性,而不是原始的 Matlab uicontrol 对象。要访问 Matlab uicontrol 的底层 Java 控件,您需要使用 findjobj utility,我相信我在您引用的博文中解释过(您可能错过了关键步骤):

jPanel = findjobj(hPanel);
jPanel.KeyPressedCallback = @myMatlabCallbackFunc;

请注意,Matlab 面板仅在 HG2 中成为基于 Java 的对象(R2014b,see here)。因此,在 R2014a 和更早的 Matlab 版本中,您将无法使用此技术,只能在较新的版本中使用。

【讨论】:

  • 感谢您的提示!不幸的是,我再也无法获得 Matlab 许可证了。这听起来确实很有希望,而且当我写这个问题时,我可能还没有使用 2014b。
【解决方案2】:

我没有看到任何可以使用的回调属性或可以附加侦听器的事件。

>> events(h_panel)
Events for class matlab.ui.container.Panel:
    ObjectBeingDestroyed
    LocationChanged
    SizeChanged
    ButtonDown
    Reset
    PropertyAdded
    PropertyRemoved

只有鼠标事件 (ButtonDown) 和 ButtonDownFcn 回调。也许还有其他技巧。问 Yair Altman!

【讨论】:

    【解决方案3】:

    最终,我发现这个问题有两个合理的解决方案,都涉及我最初描述为“涉及父图形的某种黑客行为”。它们都需要某种“活动”面板或相关图形中的对象的概念。

    解决方案 1

    依靠最后点击的对象将图中的键盘输入定向到该对象。对图中需要键盘输入的每个对象使用ButtonDownFcn。在回调中,将对象的句柄作为“活动”对象存储在图窗的appdata中。 (类似于setappdata(h_fig, 'active_obj', h_obj。)然后将图中的KeyPressFcn 设置为一个函数,该函数将从appdata 中获取该句柄并相应地分支。

    解决方案 2

    使用某种按键方案来决定将进一步输入定向到哪个对象。如果您有许多只需要消除歧义的类似对象,则此方法效果很好。例如,将图窗的KeyPressFcn 设置为使用键1-9 表示对应编号的对象的函数。将进一步的键盘输入定向到该对象或相关功能。

    这两种方法都不是完美的,我希望有一种方法可以避免遍历该图,但实际上这些实现起来并不复杂。我实际上是同时使用两者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多