【问题标题】:Alt key is not properly working in JTextFieldAlt 键在 JTextField 中无法正常工作
【发布时间】:2012-10-29 21:21:39
【问题描述】:

我正在尝试使用“Alt”键在 Java 中的两个 JTextField 之间切换。我已经使用了代码:

private void GetAltKey(java.awt.event.KeyEvent evt) {
        if (evt.isAltDown()) {
            this.GetVectorDirect(true); //Select another JTextField
        }
}

现在,这种类型的代码可以工作,但不能正常工作。我需要按两次“Alt”键才能真正切换。不仅对于该键,所有其他键都会发生这种情况 - 立即按下下一个键将被忽略,即,我需要键入两次才能按相同的键。

有什么更好的方法来做到这一点?

【问题讨论】:

    标签: java jtextfield keylistener key-bindings alt


    【解决方案1】:

    发生这种情况是因为您按下的第一个 alt 正在触发 GetAltKey 事件(顺便说一下,请考虑更改为 getAltKey),请注意,当这种情况发生时,您的 alt 键没有按下,所以您的evt.isAltDown() 返回错误。

    解决方法很简单,把你的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
        }
    }
    

    我希望它有所帮助。干杯

    【讨论】:

    • 当我用于单个文本字段时效果很好;但是当我尝试在 2 个文本字段之间切换时,再次需要 2 次按键。最后,在我看来,Alt 键有两个功能,因为它由程序引导,另一个是 Windows 中的默认行为 - 选择菜单选项。所以,我决定改用 Pgup 和 Pgdn 键。它工作正常。
    • 您可以尝试以下操作,在 this.GetVectorDirect(true) 之前放置一个 System.out.println("Alt press") ,您将看到每次您按下 alt 时程序都会获取它键
    【解决方案2】:

    我会改用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();
                        }
                    }
                });
    
            }
    
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-04
      • 2022-11-13
      • 2011-12-11
      • 2016-11-13
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      相关资源
      最近更新 更多