2016-11-23 2 views
3

J'ai une entrée appelée JTextArea et j'essaie de récupérer la chaîne inputValue lorsque j'appuie sur la touche fléchée vers le haut. Jusqu'à présent, ce code ne semble pas fonctionner et je ne suis pas sûr de savoir pourquoi. S'il vous plaît aider.Ajout d'un écouteur de touches à une classe JtextA123

input.addKeyListener(new KeyListener() {    
     public void keyTyped(KeyEvent e) { 
      System.out.println("test"); 
      if(e.getKeyCode() == KeyEvent.VK_UP) { 
       input.setText(inputValue); 
       System.out.println("up is pressed"); 
      }  
     } 

     @Override 
     public void keyPressed(KeyEvent e) { 
      // TODO Auto-generated method stub 
     } 

     @Override 
     public void keyReleased(KeyEvent e) { 
      // TODO Auto-generated method stub  
     } 
    }); 
+0

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. –

Répondre

2

vous devez remplacer vide keyPressed au lieu de keyTyped

@Override 
     public void keyPressed(KeyEvent e) { 
      System.out.println("test"); 
      if(e.getKeyCode() == KeyEvent.VK_UP) { 
       input.setText(inputValue); 
       System.out.println("up is pressed"); 

     } 

parce que ce n'est pas un caracter

5

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()); 
    } 
} 
+0

J'ai rencontré ce problème plus tôt lors de l'utilisation d'un écouteur d'actions sur des composants swing. J'ai fini par utiliser le verrouillage de fil pour régler le problème, mais je pense que cela aurait pu mieux fonctionner à long terme. tant pis. – CNorlander

+0

@CNorlander: Je ne suis pas sûr d'avoir compris votre dernier commentaire. Mais une question: pourquoi piéges-tu la presse à flèche haute dans un JTextArea, car c'est une exigence plutôt inhabituelle? Et voulez-vous que la flèche vers le haut fonctionne également comme il se doit - pour déplacer le curseur vers le haut? Et une petite considération de côté: pensez à voter pour toutes les réponses qui montrent des efforts pour essayer de vous aider. –

+0

La zone de texte est utilisée pour la saisie dans un jeu d'aventure de texte et est désactivée lorsque l'entrée de l'utilisateur n'est pas souhaitée. Je ne veux pas que l'utilisateur puisse utiliser cette commande fléchée vers le haut lorsque le champ n'est pas activé. la touche fléchée vers le haut n'a pas besoin d'effectuer sa fonction normale. – CNorlander