Java 如何使用VK_UP或VK_DOWN移动到上一个或下一个文本字段?
我想使用VK_向上或VK_向下移动焦点,这样它就可以转到上一个或下一个文本字段 我该怎么做 我试着用这个,但没用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
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);
}
}