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

时间:2012-07-08 03:18:27

标签: java keyevent

我想使用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键不起作用。

非常感谢你。

2 个答案:

答案 0 :(得分:2)

解决方案想法

建议摆动地图

取决于您使用的小部件库。如果您使用的是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);
    }
}

答案 1 :(得分:0)

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