再会!

我想将 keyevent 监听器添加到 jTextField 以便如果用户按下 tab 键,插入符号位置将转到 jtextField 内文本的末尾,这是我的代码:

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
    if(evt.getKeyCode()==KeyEvent.VK_TAB){
        evt.consume();
        jTextField1.setCaretPosition(jTextField1.getText().length());
    }
}

但它不起作用。

我怎样才能做到这一点?

最佳答案

一种方法是:

  • 首先,不要使用 KeyListener,因为这是一个 Swing 应用程序,如果可以避免,您不应该在 Swing 应用程序中使用 KeyListeners。
  • 接下来通过 jTextField1.setFocusTraversalKeysEnabled(false);
  • 将 JTextField 的焦点遍历键启用属性设置为 false
  • 然后使用 key bindings ,(再次)不是 KeyListener,来改变那个组件的 tab 键的行为。

  • 例如:
    import java.awt.event.*;
    import javax.swing.*;
    
    public class OverrideTab {
       private static void createAndShowGui() {
          JPanel mainPanel = new JPanel();
          final JTextField jTextField1 = new JTextField("This is the text", 20);
    
          mainPanel.add(new JButton("Here just to get focus"));
          mainPanel.add(jTextField1);
    
          // just to move the caret to position 0 so we can see the key
          // bindings code in action
          jTextField1.addFocusListener(new FocusAdapter() {
             @Override
             public void focusGained(FocusEvent e) {
                jTextField1.setCaretPosition(0);
             }
          });
    
          // turn tab key as focus traversal off for the component
          jTextField1.setFocusTraversalKeysEnabled(false);
    
          // set the key bindings
          int condition = JComponent.WHEN_FOCUSED;
          InputMap inputMap = jTextField1.getInputMap(condition);
          ActionMap actionMap = jTextField1.getActionMap();
          String tab = "tab";
          inputMap.put(KeyStroke.getKeyStroke(KeyEvent.VK_TAB, 0), tab);
          actionMap.put(tab, new AbstractAction() {
    
             @Override
             public void actionPerformed(ActionEvent arg0) {
                jTextField1.setCaretPosition(jTextField1.getText().length());
                System.out.println("here");
             }
          });
    
    
    
          JFrame frame = new JFrame("OverrideTab");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          frame.getContentPane().add(mainPanel);
          frame.pack();
          frame.setLocationByPlatform(true);
          frame.setVisible(true);
       }
    
       public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
             public void run() {
                createAndShowGui();
             }
          });
       }
    }
    

    当然,此代码将阻止您将制表符移出 JTextField,因此如果此行为是必要且重要的,您可以使用 setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<KeyStroke>emptySet()) 而不是完全禁用焦点遍历。

    此外,您想要的行为违反了大多数窗口操作系统的标准,因此您需要有一个非常好的理由来想要这样做,因为您可能会混淆您的用户。

    关于java - 覆盖 VK_Tab 焦点操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9286180/

    10-12 06:28