2012-02-15 57 views
3

美好的一天!改寫VK_Tab焦點動作

我綁的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()); 
    } 
} 

但它不起作用。

我該如何做到這一點?

回答

6

的一種方法是:

所有的
  • 首先,不使用KeyListener的,因爲這是一個Swing應用程序,如果能避免它,你不應該在Swing應用程序使用KeyListeners。
  • 下一頁通過jTextField1.setFocusTraversalKeysEnabled(false);
  • 設置啓用了您的JTextField虛假的財產的焦點遍歷鍵然後用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(); 
     } 
     }); 
    } 
} 

當然這個代碼將阻止你能夠Shift-Tab鍵出JTextField的,因此,如果這種行爲是必要的和重要的,你可以使用setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, Collections.<KeyStroke>emptySet())代替完全禁用焦點遍歷。另外,你期望的行爲違背了大多數窗口操作系統的標準,所以你需要有一個很好的理由去渴望這個,因爲你可能會混淆你的用戶。

+0

非常感謝。真的行。順便說一下,我在覆蓋代碼中進行了一些修改,以便用戶在再次按下Tab鍵時在其他組件中移動。 (jTextField1.getCaretPosition()== jTextField1.getText()。length()){ jButton1.requestFocus(true); } else { jTextField1.setCaretPosition(jTextField1.getText().length()); } }' – dmfrl 2012-02-15 01:50:15