我明白这是一个荒谬的(有点尴尬的)场景,我开始相信这实际上是不可能克服的…
我为我的客户开发了一个基本的摇摆应用程序,其中包含一个包含文本字段和组合框的框架,用于验证/处理在失去焦点时捕获的数据-标准问题。
我的客户一心想生活在DOS的日子里,能够使用ENTER
键而不是默认的TAB
键从一个字段遍历到另一个字段。
我通过实现KeyboardFocus usManager. getCurrentKeyboardFocus usManager().setDefaultFocus usTraversalKeys(…)
简单明了地实现了这一点。(完整代码见下文)
在数据被捕获期间的某些点,我需要显示错误或警告消息,我通过明显的JOptionPane. showMessageDialog(WARNING_MESSAGE)
例程来实现这一点。
问题-当面对对话框消息框时,我的客户希望他可以按ENTER
关闭它,这不再起作用,因为我显然覆盖了ENTER
的actionPer的
事件,而是将其分配为焦点遍历键。
我知道SPACE
可以完美地触发Ok按钮上的actionPerform
事件,这反过来又愉快地关闭对话框。问题是我的客户希望能够按ENTER
…
我试图避免创建自定义对话框消息框,但即使我尝试了这一点,我认为我也无法达到我想要的结果,因为我的下一点……
我尝试使用JOptionPane. showOptionDialog(OK_OPTION,JOptionPane。ERROR_MESSAGE,null,按钮,null)
,其中按钮
是一个预先创建的按钮数组,我可以将操作/键/焦点侦听器添加到其中,以尝试重新创建ENTER
键的默认行为。问题是,只要我将其分配为焦点遍历键,ENTER
就不再在这些事件侦听器中注册。
这就是我如何设置ENTER
(和ESC
,TAB
和SHIFTTAB
)作为焦点遍历键:
// Enable Enter & Tab as forward traversal keys and Esc & Shift-Tab as backward traversal keys
KeyStroke esc = KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0);
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
KeyStroke tab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0);
KeyStroke shiftTab = KeyStroke.getKeyStroke(KeyEvent.VK_TAB, KeyEvent.SHIFT_DOWN_MASK);
Set<KeyStroke> forwardKeys = new HashSet<KeyStroke>();
forwardKeys.add(enter);
forwardKeys.add(tab);
Set<KeyStroke> backwardKeys = new HashSet<KeyStroke>();
backwardKeys.add(esc);
backwardKeys.add(shiftTab);
KeyboardFocusManager.getCurrentKeyboardFocusManager().setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, forwardKeys);
KeyboardFocusManager.getCurrentKeyboardFocusManager().setDefaultFocusTraversalKeys(KeyboardFocusManager.BACKWARD_TRAVERSAL_KEYS, backwardKeys);
知道这是否可能,或者我应该告诉我的客户处理它并习惯按SPACE
吗?
提前感谢,
桑德尔
在okButton上尝试一下,回车键将开始工作,但在此选项卡移位选项卡之后也不会在按钮上工作。
okButton.setFocusTraversalKeysEnabled(false);