Java 覆盖VK_选项卡焦点操作

Java 覆盖VK_选项卡焦点操作,java,swing,jtextfield,key-bindings,keyevent,Java,Swing,Jtextfield,Key Bindings,Keyevent,你好 我打算将keyevent listener添加到jTextField,这样,如果用户按下tab键,插入符号位置将转到jTextField内文本的末尾,下面是我的代码: private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) { if(evt.getKeyCode()==KeyEvent.VK_TAB){ evt.consume(); jTextField1.setCaretPos

你好

我打算将keyevent listener添加到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应用程序中使用KeyListener
  • 接下来,通过
    jTextField1.setFocusTraversalKeysEnabled(false),将JTextField的focus traversal keys enabled属性设置为false
  • 然后使用(再次)而不是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();
         }
      });
   }
}
当然,此代码将阻止您将tab移出JTextField,因此如果此行为是必要且重要的,您可以使用
setFocusTraversalKeys(KeyboardFocusManager.FORWARD\u TRAVERSAL\u KEYS,Collections.emptySet())
而不是完全禁用焦点遍历


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

非常感谢。它确实有效。顺便说一下,我在覆盖代码中做了一些修改,以便用户在再次按下tab按钮后可以移入其他组件
public void actionPerformed(ActionEvent arg0){if(jTextField1.getCaretPosition()==jTextField1.getText().length()){jButton1.requestFocus(true);}else{jTextField1.setCaretPosition(jTextField1.getText().length());}