2014-11-04 114 views
2

如何能uipanel內一個捕獲鍵盤輸入,即當面板說有什麼重點?我發現uipanel沒有KeyPressFcn財產。我讀過無證Matlab的this post關於Java的回調,但我也不能得到KeyPressedCallback工作。例如,如果我嘗試這樣的:如何捕獲按鍵在Matlab uipanel

set(h_panel, 'KeyPressFcn', @(src, event)key_press(obj, src, event)); 

我得到這個錯誤:如果我嘗試KeyPressedCallback發生

The name 'KeyPressFcn' is not an accessible property for an instance of class 'uicontrol'.

同樣的事情。恐怕我不得不採取某種涉及父母形象的手段,如果可能,我想避免這種手段。

+0

從某種意義上說,面板可以「激活」,並且可以接受按鍵?顯然有一個按鈕(鼠標)的事件,但沒有關鍵... – chappjc 2014-11-04 21:16:11

+0

@chappjc是正確的,面板不活躍在其他uicontrols是。您可以嘗試在**圖**'KeyPressFcn'中截取按鍵事件,然後檢查您的鼠標是否位於uipanel上方(或者焦點控制是您uipanel的「孩子」)。如果是的話,做你的東西。如果不是,則丟棄按鍵事件或將其傳遞給其他人物聽衆。 – Hoki 2014-11-05 15:45:43

+0

嗯,我想避免訴諸父母的數字回調,但我想另一種方法是爲'uipanel'內的每個'uicontrol'設置回調。但是軸和線系列真的沒有'KeyPressFcn'!? – patrickvacek 2014-11-06 15:33:20

回答

0

最終,我發現這個問題有兩個合理的解決方案,都涉及到我最初描述的「涉及父圖的某種破解」。它們都需要某種形式的「主動」面板或對象內的對象的概念。

解決方案1 ​​

依靠最後點擊的對象直接鍵盤輸入圖中的那個對象上。對於圖中需要鍵盤輸入的每個對象,使用ButtonDownFcn。在回調中,將對象的句柄作爲「活動」對象存儲在圖的appdata中。 (喜歡的東西setappdata(h_fig, 'active_obj', h_obj。)然後在圖中設定KeyPressFcn的功能將得到處理出來的應用程序數據和分支相應的。

解決方案2

使用某種形式的按鍵方案來決定哪個對象直接進一步投入。如果你有一些類似的對象只需要消歧就可以很好地工作。例如,將圖的KeyPressFcn設置爲使用鍵1-9來指示相應編號的對象的功能。直接向該對象或相關功能鍵入更多的鍵盤輸入。

這兩種方法都不是完美的,我希望有一種方法可以避免通過圖形,但實際上這些方法並不是很複雜。我實際上是同時使用兩者。

0

我不明白,你可以使用任何回調屬性或事件,您可以附加一個監聽器。

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

只需鼠標事件(ButtonDown)和ButtonDownFcn回調。也許還有其他的技巧。問Yair Altman!

1

KeyPressedCallback是基礎的Java對象的屬性,而不是原來Matlab的uicontrol對象。要訪問一個Matlab uicontrol的基礎Java控件,您需要使用findjobj utility,因爲我相信我在你引用我的博客文章解釋(你可能錯過了關鍵的一步):

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

注意Matlab的面板僅在HG2中成爲基於Java的對象(R2014b,see here)。所以在R2014a和早期的Matlab版本中,您將無法使用這種技術,只能在其中一個較新版本中使用。

+0

感謝您的提示!不幸的是,我不再能夠訪問Matlab許可證。這聽起來很有前景,當我寫這個問題時,我可能還沒有使用2014b。 – patrickvacek 2017-12-22 13:17:45