我正在尝试使用'Alt'键在Java中的两个JTextField之间切换。我使用过代码:
private void GetAltKey(java.awt.event.KeyEvent evt) {
if (evt.isAltDown()) {
this.GetVectorDirect(true); //Select another JTextField
}
}
现在,这种类型的代码正在运行,但不正确。我需要按两次“Alt”键才能实际切换。不仅对于那个键,它发生在所有其他键上 - 忽略下一次按键,即我需要键入两次按相同的键。
有什么更好的方法可以做到这一点?
答案 0 :(得分:1)
这种情况正在发生,因为你要按的第一个alt
是触发GetAltKey事件(顺便说一句,考虑改为getAltKey),请注意,当发生这种情况时,你的alt
键不是向下,所以你的evt.isAltDown()
返回false。
解决方案很简单,将evt.isAltDown()
方法更改为evt.getKeyCode() == KeyEvent.VK_ALT
。
private void getAltKey(java.awt.event.KeyEvent evt) {
if (evt.getKeyCode() == KeyEvent.VK_ALT) {
this.GetVectorDirect(true); //Select another JTextField
}
}
我希望它有所帮助。干杯
答案 1 :(得分:1)
我会使用key bindings API代替,关键的监听器往往会很麻烦,并且通常会产生很多混乱的if-else
语句。
public class KeyBindingsTransfer {
public static void main(String[] args) {
new KeyBindingsTransfer();
}
public KeyBindingsTransfer() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException ex) {
} catch (InstantiationException ex) {
} catch (IllegalAccessException ex) {
} catch (UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TransferPane());
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
protected class TransferPane extends JPanel {
private JTextArea left;
private JTextArea right;
public TransferPane() {
setLayout(new GridLayout(1, 2, 4, 4));
left = new JTextArea();
right = new JTextArea();
add(left);
add(right);
InputMap inputMap = getInputMap(WHEN_IN_FOCUSED_WINDOW);
inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_ALT, 0, true), "transferOnAlt");
ActionMap actionMap = getActionMap();
actionMap.put("transferOnAlt", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Clicked");
if (left.hasFocus()) {
right.requestFocusInWindow();
} else if (right.hasFocus()) {
left.requestFocusInWindow();
}
}
});
}
}
}