Java 如何使用VK_UP或VK_DOWN移动到上一个或下一个文本字段?

Java 如何使用VK_UP或VK_DOWN移动到上一个或下一个文本字段?,java,keyevent,Java,Keyevent,我想使用VK_向上或VK_向下移动焦点,这样它就可以转到上一个或下一个文本字段 我该怎么做 我试着用这个,但没用 private void passwordTFKeyTyped(java.awt.event.KeyEvent evt) { char c = evt.getKeyChar(); if (c == KeyEvent.VK_UP) { usernameTF.grabFocus(); } } 因此,我尝试添加“System.out.p

我想使用VK_向上或VK_向下移动焦点,这样它就可以转到上一个或下一个文本字段

我该怎么做

我试着用这个,但没用

 private void passwordTFKeyTyped(java.awt.event.KeyEvent evt) {      
 char c = evt.getKeyChar();

    if (c == KeyEvent.VK_UP) {
        usernameTF.grabFocus();
    }
 }
因此,我尝试添加“System.out.println(c)”
并且给出的结果是空的(empty并不意味着像“”或null这样的空字符串),更像是UP键不起作用


非常感谢。

我不是专家,但我认为当用户专注于文本字段时,Java不会那样听。也许类似的东西适合您的需要?

解决方案想法 建议摇摆图 取决于您使用的小部件库。如果您使用的是Swing,那么从文本字段中获取,并向其添加合适的绑定。最初我希望您可以复制Tab和Shift Tab的绑定,但正如我在实验中发现的,这些并不是单个组件的
InputMap
的一部分。因此,您必须定义新键,并使用
ActionMap
将这些键映射到新操作

粘贴代码的问题 您引用的代码无效,因为您应该使用而不是。前者对应于那些
VK_
常量,而后者将生成“正常”(即打印)键的字符,并且仅在
key_键入的事件期间。对于非打印密钥,将永远不会生成
KEY\u TYPED
事件,而在所有其他事件期间,将生成密钥字符

例子 这些示例是在以后的编辑中添加的

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

示例1:Swing输入和动作映射 示例2:AWT KeyListener
哦,我明白了,所以我们可以使用Shift+Tab将焦点移动到上一个文本字段。应该可以了,哈哈。谢谢你,MvGI,很抱歉我的后续行动太晚了,谢谢你的建议。是的,我把它放在Key_typed事件中,并尝试将getKeyChar更改为getKeyCode。但它不起作用。你能给我一些代码示例吗?我真的不明白你上面提到的字符未定义的东西。非常感谢。@radik:添加了代码。注意到焦点遍历似乎并不是真正由swing中的
InputMap
管理的。至少不适用于单个组件。关于“未定义的
CHAR
事物”:当你试图获取一个不代表字符的键的
keyChar
时,你会得到一个常数。阅读文档,我发现像箭头键这样的非打印键根本不会生成键入的
key
事件。包含在我的答案中。
DocumentListener
只侦听文本组件内容的更改。由于箭头键不会更改内容,
DocumentListener
不会听到它。
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);
    }
}
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);
    }
}