我使用GUIDE在matlab中构建了一个GUI,并使用我的图中的WindowKeyPressFcn回调函数为某些操作添加了键盘快捷键。我的问题是我想使用空格键作为快捷键之一,但它已经有一个预设用法:它激活当前选择的控件(即与点击所选按钮相同)。
虽然我可以通过回调触发空格键上的预期操作,但我发现无法删除这些额外的不需要的功能。结果是执行了两个动作 - 我编程的动作和非预期的按钮按下,这会造成混乱。底线是我不能使用空格键作为快捷方式。有没有办法关闭此功能或以某种方式绕过它?也许某些事情会阻止按键在我的回调处理之后到达GUI?
我更喜欢采用Matlab记录的方式,但如果不可能,也欢迎使用Java黑客。
答案 0 :(得分:0)
AFAIK不受欢迎的行为与Matlab相关的操作系统更多,我知道无法移除它,但是你可以解决它。
执行此操作的一种方法是检查按钮回调中按下的最后一个键是什么,通过向按钮添加KeyPressFcn来执行此操作。我在下面创建了一个简单的例子:
function spacebarTest
% create a figure
hFig = figure ( 'KeyPressFcn', @KeyPress );
% create a uicontrol
uicontrol ( 'style', 'pushbutton', 'Callback', @PushButton, 'KeyPressFcn', @KeyPress );
% store the last key pressed information in the fiure handle
userData.lastKey = '';
set ( hFig, 'userData', userData );
end
function KeyPress ( obj, event )
% obtain the handle for the figure
hFig = ancestor ( obj, 'figure' );
% extract the user data
userData = get ( hFig, 'userData' );
% store the last key in the user data
userData.lastKey = event.Key;
% update the figure handle user data
set ( hFig, 'userData', userData );
disp ( 'spacebar shortcut' );
end
function PushButton ( obj, event )
% get the figure handle
hFig = ancestor ( obj, 'figure' );
% extract the user data
userData = get ( hFig, 'userData' );
% check if spacebar was the last key pressed
if strcmp ( userData.lastKey, 'space' ); return; end
disp ( 'running callback - push me' );
end
这样做的一个问题是它仍然“看起来”像你的按钮被按下了,虽然回调没有运行。要解决此问题,您需要停止按钮获得焦点,您需要用JButton(java)替换您的uicontrol按钮并使用FocusGainedCallback