【问题标题】:Override VK_Tab Focus action覆盖 VK_Tab 焦点操作
【发布时间】:2012-02-15 00:14:10
【问题描述】:

美好的一天!

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

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

但它不起作用。

我怎样才能做到这一点?

【问题讨论】:

    标签: java swing jtextfield key-bindings keyevent


    【解决方案1】:

    一种方法是:

    • 首先,不要使用 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()) 而不是完全禁用焦点遍历。

    此外,您希望的行为违反了大多数窗口操作系统的标准,因此您需要有充分的理由希望这样做,因为您可能会混淆您的用户。

    【讨论】:

    • 非常感谢。真的行。顺便说一句,我对覆盖代码进行了一些修改,以便用户在再次按下选项卡按钮后移动其他组件。 public void actionPerformed(ActionEvent arg0) { if (jTextField1.getCaretPosition()==jTextField1.getText().length()){ jButton1.requestFocus(true); }else{ jTextField1.setCaretPosition(jTextField1.getText().length()); } }
    猜你喜欢
    • 1970-01-01
    • 2014-12-04
    • 1970-01-01
    • 2020-12-02
    • 2020-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多