Vous devez prendre soin lorsque vous utilisez les auditeurs de bas niveau comme KeyListeners sur les composants de texte Swing comme JTextAreas, depuis déconner avec ceux-ci peut provoquer le comportement du composant de texte. Il est préférable d'utiliser DocumentListener si vous souhaitez modifier le document ou un DocumentFilter si vous voulez écouter et bloquer ou modifier l'entrée de texte avant que ne se produise. Si vous voulez simplement être averti des clés telles que la flèche vers le haut, j'utiliserais les raccourcis clavier - ce que JTextArea utilise lui-même pour être averti et réagir aux pressions sur les touches, et remplacerait la liaison des touches par nouveau. Si vous faites cela avec soin, vous pouvez même appeler l'action originale liée à la touche enfoncée dans votre nouvelle Action. Par exemple:
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.*;
@SuppressWarnings("serial")
public class TextAreaTrapUp extends JPanel {
private JTextArea textArea = new JTextArea(20, 40);
public TextAreaTrapUp() {
// get JTextArea's InputMap and ActionMap
int condition = JComponent.WHEN_FOCUSED;
InputMap inputMap = textArea.getInputMap(condition);
ActionMap actionMap = textArea.getActionMap();
// get the up keystroke
KeyStroke upKeyStroke = KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0);
String upKey = (String) inputMap.get(upKeyStroke); // get the input map's key for this keystorke
Action originalUpAction = actionMap.get(upKey); // and get the action map's original action for this key
Action newUpAction = new NewUpAction(originalUpAction); // create our new up action passing in the old one
actionMap.put(upKey, newUpAction); // and set this into our ActionMap
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
add(new JScrollPane(textArea));
}
// Action called when up-arrow pressed
private class NewUpAction extends AbstractAction {
private Action originalUpAction; // the original action
public NewUpAction(Action originalUpAction) {
this.originalUpAction = originalUpAction;
}
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Up Arrow Pressed");
// if you want to move the caret up, then call the original action
// as well
if (originalUpAction != null) {
originalUpAction.actionPerformed(e);
}
}
}
private static void createAndShowGui() {
TextAreaTrapUp mainPanel = new TextAreaTrapUp();
JFrame frame = new JFrame("TextAreaTrapUp");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> createAndShowGui());
}
}
N'utilisez pas KeyListener avec des composants de texte Swing car ils peuvent perturber le fonctionnement natif du composant. Il existe de bien meilleures façons d'intercepter les touches dans ces composants, notamment l'utilisation de DocumentListeners, DocumentFilters et de liaisons de clés. –