提问者:小点点

Swing-Enter可以用于焦点遍历和执行操作吗?


我明白这是一个荒谬的(有点尴尬的)场景,我开始相信这实际上是不可能克服的…

我为我的客户开发了一个基本的摇摆应用程序,其中包含一个包含文本字段和组合框的框架,用于验证/处理在失去焦点时捕获的数据-标准问题。

我的客户一心想生活在DOS的日子里,能够使用ENTER键而不是默认的TAB键从一个字段遍历到另一个字段。

我通过实现KeyboardFocus usManager. getCurrentKeyboardFocus usManager().setDefaultFocus usTraversalKeys(…)简单明了地实现了这一点。(完整代码见下文)

在数据被捕获期间的某些点,我需要显示错误或警告消息,我通过明显的JOptionPane. showMessageDialog(WARNING_MESSAGE)例程来实现这一点。

问题-当面对对话框消息框时,我的客户希望他可以按ENTER关闭它,这不再起作用,因为我显然覆盖了ENTERactionPer的事件,而是将其分配为焦点遍历键。

我知道SPACE可以完美地触发Ok按钮上的actionPerform事件,这反过来又愉快地关闭对话框。问题是我的客户希望能够按ENTER

我试图避免创建自定义对话框消息框,但即使我尝试了这一点,我认为我也无法达到我想要的结果,因为我的下一点……

我尝试使用JOptionPane. showOptionDialog(OK_OPTION,JOptionPane。ERROR_MESSAGE,null,按钮,null),其中按钮是一个预先创建的按钮数组,我可以将操作/键/焦点侦听器添加到其中,以尝试重新创建ENTER键的默认行为。问题是,只要我将其分配为焦点遍历键,ENTER就不再在这些事件侦听器中注册。

这就是我如何设置ENTER(和ESCTABSHIFTTAB)作为焦点遍历键:

// 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吗?

提前感谢,

桑德尔


共1个答案

匿名用户

在okButton上尝试一下,回车键将开始工作,但在此选项卡移位选项卡之后也不会在按钮上工作。

    okButton.setFocusTraversalKeysEnabled(false);