2014-11-04 3 views
2

Как можно записывать ввод клавиатуры внутри uipanel, то есть когда что-либо в панели фокусируется? Я нашел, что uipanel не имеет KeyPressFcn собственности. Я прочитал this post из недокументированной Matlab о Java-обратных вызовах, но я также не могу получить KeyPressedCallback для работы. Например, если я пытаюсь это:Как захватить нажатие клавиши в Matlab uipanel

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

Может ли панель быть «активной» в том смысле, что она выбрана и может получать нажатия клавиш? Очевидно, есть кнопка (мышь), но ничего для клавиш ... – chappjc

+0

@chappjc прав, панель не активна в том смысле, что другие uicontrols есть. Вы можете попытаться перехватить событие нажатия клавиши на ** цифре ** 'KeyPressFcn', а затем проверить, была ли ваша мышь выше uipanel в то время (или если элемент управления, который имеет фокус, является« дочерним »вашего uipanel). Если да, делайте свое дело. если нет, отбросьте событие нажатия клавиши или передайте его другим слушателям. – Hoki

+0

Ну, я хотел избежать использования обратных вызовов родительских фигур, но я думаю, что альтернативой является, возможно, установка обратных вызовов для каждого 'uicontrol' внутри' uipanel'. Но у осей и ретейлов действительно нет «KeyPressFcn» !? – patrickvacek

ответ

0

В конечном счете, я обнаружил, что есть две разумные решения этой проблемы, связанные с тем, что я изначально описывал как «какой-то взлом с участием родительской фигуры». Оба они требуют какой-то концепции «активной» панели или объекта в рассматриваемой фигуре.

Решение 1

Положитесь на последнем щелчке объекта прямого ввода с клавиатуры на рисунке к этому объекту. Используйте ButtonDownFcn для каждого объекта на рисунке, который требует ввода клавиатуры. В обратном вызове сохраните дескриптор объекта в appdata рисунка как «активный» объект. (Что-то вроде setappdata(h_fig, 'active_obj', h_obj.) Затем установите KeyPressFcn на рисунке функции, которая получит этот дескриптор из appdata и ветви соответственно.

Решение 2

Используйте какую-то схему нажатия клавиши, чтобы решить, какой объект направить дополнительный вход в. Это хорошо работает, если у вас есть несколько похожих объектов, которые просто требуют устранения неоднозначности. Например, установите KeyPressFcn фигуры на функцию, которая использует клавиши 1-9 для обозначения соответствующего нумерованного объекта. Направлять дальнейший ввод клавиатуры на этот объект или связанную с ним функцию.

Ни один из методов не является совершенным, и я хочу, чтобы был способ избежать прохождения фигуры, но на практике это не так сложно реализовать. Я фактически использую оба одновременно.

0

Я не вижу никаких свойств обратного вызова, которые вы можете использовать, или событий, к которым вы можете подключить слушателя.

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

Просто событие мыши (ButtonDown) и ButtonDownFcn обратного вызова. Возможно, есть и другие трюки. Спросите Яира Альтмана!

1

KeyPressedCallback является свойством базового объекта Java, а не исходного объекта Matlab uicontrol. Чтобы получить доступ к лежащему в основе управления Java в виде UIControl Matlab, вам нужно использовать findjobj utility, как я считаю, что я объяснил в своем блоге, что вы ссылочный (вы, вероятно, пропустили это важный шаг):

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

Обратите внимание, что Matlab панели только стали объектами на Java в HG2 (R2014b, see here). Так что на R2014a и более ранних версиях Matlab вы не сможете использовать эту технику только в одном из новых выпусков.

+0

Спасибо за подсказку! К сожалению, я больше не имею доступа к лицензии Matlab. Это звучит многообещающе, и вполне возможно, что когда я написал вопрос, я еще не использовал 2014b. – patrickvacek

Смежные вопросы