【发布时间】:2014-12-21 00:20:50
【问题描述】:
我在 java 中创建了一些按钮,当单击它时应该会显示一个新表单。我想使用箭头键选择按钮和空格键来单击它。 当我从 ide 或 cmd 运行项目时,我的代码可以工作。但是当使用 eclipse 创建可运行的 jar 文件时,当我按下键盘键时,按钮没有突出显示。我只能使用鼠标。问题在哪里是吗?
【问题讨论】:
我在 java 中创建了一些按钮,当单击它时应该会显示一个新表单。我想使用箭头键选择按钮和空格键来单击它。 当我从 ide 或 cmd 运行项目时,我的代码可以工作。但是当使用 eclipse 创建可运行的 jar 文件时,当我按下键盘键时,按钮没有突出显示。我只能使用鼠标。问题在哪里是吗?
【问题讨论】:
当我从 ide 或 cmd 运行项目时,我的代码可以工作。
那么你是怎么做到的呢?我猜你正在使用 KeyListener。 KeyListener 仅在组件具有焦点时才有效,我猜您的按钮没有焦点,因此代码不起作用。一般来说,你不应该使用 KeyListener Swing 被设计为与 Key Bindings 一起使用。
因此,解决此问题的一种方法是创建一个自定义操作,用于向前和向后切换,然后将这些操作绑定到包含按钮的面板。即使组件没有焦点,Key Binding 也可以工作。代码类似于:
InputMap im = panel.getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
String rightText = "RIGHT";
im.put(KeyStroke.getKeyStroke(rightText), rightText);
panel.getActionMap().put(rightText, new AbstractAction()
{
@Override
public void actionPerformed(ActionEvent e)
{
KeyboardFocusManager.getCurrentKeyboardFocusManager().focusNextComponent();
}
});
另一种方法是使用KeyboardFocusManager。 KeyboardFocusManager 管理焦点遍历。默认的焦点遍历键是 Tab 和 Shift-Tab。
如果您还想使用箭头键,则需要将这些 KeyStrokes 添加到焦点管理器。因此,对于您想要更改的每个组件,您都可以:
Set<AWTKeyStroke> set = new HashSet<AWTKeyStroke>( button.getFocusTraversalKeys(
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS ) );
set.add( KeyStroke.getKeyStroke( "RIGHT" ) );
button.setFocusTraversalKeys(
KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, set );
第一种方法适用于面板上的所有组件。单个组件的第二种方法。
【讨论】:
Yea i am using a key listener. - 我给了你两个更好的解决方案。
尝试将按钮的助记符属性设置为您想要的键。
myJButton.setMnemonic(...);
【讨论】: