如何使用VK_UP或VK_DOWN移动到上一个或下一个Textfield?

我想使用VK_UP或VK_DOWN来移动焦点,因此它可以转到上一个或下一个文本字段。

我怎样才能做到这一点 ?

我尝试使用它,但它没有用。

private void passwordTFKeyTyped(java.awt.event.KeyEvent evt) { char c = evt.getKeyChar(); if (c == KeyEvent.VK_UP) { usernameTF.grabFocus(); } } 

所以我尝试添加’System.out.println(c)’
并且给出的结果是空的(空的并不意味着空字符串,如“”或null),它更像UP键不起作用。

非常感谢。

解决思路

建议摆动地图

取决于您使用的小部件库。 如果您使用的是Swing,则从文本字段中获取InputMap ,并为其添加合适的绑定。 最初我曾希望你可以复制Tab和Shift-Tab的绑定,但正如我在实验中发现的那些,它们不是各个组件的InputMap的一部分。 因此,您必须定义新键,并使用ActionMap将这些键映射到新操作。

粘贴代码有问题

您引用的代码将无法使用,因为您应该使用getKeyCode而不是getKeyChar 。 前者对应于那些VK_常量,而后者将导致“正常”(即打印)键的字符,并且仅在KEY_TYPED事件期间。 对于非打印键,将永远不会生成KEY_TYPED事件,并且在所有其他事件期间,键字符将是CHAR_UNDEFINED 。

例子

这些示例在稍后的编辑中添加。

我对以下代码进行了双重许可:您可以根据CC-Wiki的条款或GPL第3版或更高版本的条款使用它。

示例1:Swing输入和动作映射

 import java.awt.*; import java.awt.event.*; import javax.swing.*; class SO11380406a { static final Object focusNextKey = new Object(); static final Object focusPrevKey = new Object(); static final Action focusNextAction = new AbstractAction("focusNext") { public void actionPerformed(ActionEvent e) { ((Component)e.getSource()).transferFocus(); } }; static final Action focusPrevAction = new AbstractAction("focusPrev") { public void actionPerformed(ActionEvent e) { ((Component)e.getSource()).transferFocusBackward(); } }; static final KeyStroke down = KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0); static final KeyStroke up = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0); private static void remap(JComponent c) { ActionMap am = new ActionMap(); am.put(focusNextKey, focusNextAction); am.put(focusPrevKey, focusPrevAction); am.setParent(c.getActionMap()); c.setActionMap(am); InputMap im = new InputMap(); im.put(down, focusNextKey); im.put(up, focusPrevKey); im.setParent(c.getInputMap(JComponent.WHEN_FOCUSED)); c.setInputMap(JComponent.WHEN_FOCUSED, im); } public static void main(String[] args) { JFrame frm = new JFrame("SO Question 11380406 Demo A"); frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frm.getContentPane().setLayout(new GridLayout(2, 1)); JTextField a = new JTextField(80), b = new JTextField(80); frm.getContentPane().add(a); frm.getContentPane().add(b); frm.pack(); remap(a); remap(b); frm.setLocationByPlatform(true); frm.setVisible(true); } } 

示例2:AWT KeyListener

 import java.awt.*; import java.awt.event.*; import javax.swing.*; class SO11380406b { static final KeyListener arrowFocusListener = new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getModifiers() == 0) { if (e.getKeyCode() == KeyEvent.VK_DOWN) e.getComponent().transferFocus(); if (e.getKeyCode() == KeyEvent.VK_UP) e.getComponent().transferFocusBackward(); } } }; private static void remap(Component c) { c.addKeyListener(arrowFocusListener); } public static void main(String[] args) { JFrame frm = new JFrame("SO Question 11380406 Demo B"); frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frm.getContentPane().setLayout(new GridLayout(2, 1)); JTextField a = new JTextField(80), b = new JTextField(80); frm.getContentPane().add(a); frm.getContentPane().add(b); frm.pack(); remap(a); remap(b); frm.setLocationByPlatform(true); frm.setVisible(true); } } 

我不是专家,但是当用户专注于文本字段时,我不认为Java会这样听。 也许像DocumentListener这样的东西会满足你的需求?