的一種方法是:
所有的
- 首先,不使用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())
代替完全禁用焦點遍歷。另外,你期望的行爲違背了大多數窗口操作系統的標準,所以你需要有一個很好的理由去渴望這個,因爲你可能會混淆你的用戶。
非常感謝。真的行。順便說一下,我在覆蓋代碼中進行了一些修改,以便用戶在再次按下Tab鍵時在其他組件中移動。 (jTextField1.getCaretPosition()== jTextField1.getText()。length()){ jButton1.requestFocus(true); } else { jTextField1.setCaretPosition(jTextField1.getText().length()); } }' – dmfrl 2012-02-15 01:50:15