2013-08-28 12 views
7

Wenn ich die EINGABETASTE gedrückt habe, startet meine JTextArea eine neue Zeile und ich will nichts anderes tun als die doClick() Methode. Wie soll ich das machen?Java JTextArea KeyListener

textarea.addKeyListener(new KeyListener(){ 
    @Override 
    public void keyPressed(KeyEvent e){ 
     if(e.getKeyCode() == KeyEvent.VK_ENTER){ 
     button.doClick(); 
     } 
    } 

    @Override 
    public void keyTyped(KeyEvent e) { 
    } 

    @Override 
    public void keyReleased(KeyEvent e) { 
    } 
}); 
+2

nicht verwenden KeyListeners überhaupt (fragen sich, wie Ihr Code möglicherweise funktionieren kann: Sie haben _focusable_ Etiketten? Wie seltsam und benutzer-verwirrend ...) - Verwenden Sie keyBindings – kleopatra

Antwort

7

Verwendung .consume():

Verbraucht dieses Ereignis so, dass es nicht von der Quelle in der Standard Weise verarbeitet werden, die sie entstanden sind.

public void keyPressed(KeyEvent e){ 
    if(e.getKeyCode() == KeyEvent.VK_ENTER){ 
    e.consume(); 
    button.doClick(); 
    } 
} 

Documentation

+0

Vielen Dank, es hat funktioniert. –

+0

@ PéterSzakács Ausgezeichnet! Froh, dass ich helfen konnte. –

+1

Verwenden Sie keinen Key Listener. Swing wurde für die Verwendung mit Key Bindings entwickelt. – camickr

7

sollten Sie KeyBindings mit jedem JTextComponent in Frage verwenden. KeyListeners sind viel zu niedrig von Swing Perspektive. Sie verwenden das Konzept, das auf AWT verwandt war, SwingKeyBindings verwendet die gleiche Aufgabe mit mehr Effizienz zu tun, und die gewünschten Ergebnisse :-)

Ein kleines Programm für Ihre Hilfe bietet:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 

public class KeyBindingExample { 

    private static final String key = "ENTER"; 
    private KeyStroke keyStroke; 

    private JButton button; 
    private JTextArea textArea; 

    private Action wrapper = new AbstractAction() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      button.doClick(); 
     } 
    }; 

    private void displayGUI() { 
     JFrame frame = new JFrame("Key Binding Example"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     JPanel contentPane = new JPanel(new BorderLayout(5, 5)); 

     textArea = new JTextArea(10, 10); 
     keyStroke = KeyStroke.getKeyStroke(key); 
     Object actionKey = textArea.getInputMap(
       JComponent.WHEN_FOCUSED).get(keyStroke); 
     textArea.getActionMap().put(actionKey, wrapper); 

     button = new JButton("Click Me!"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       System.out.format("Button Clicked :-)%n"); 
      } 
     });  

     contentPane.add(textArea, BorderLayout.CENTER); 
     contentPane.add(button, BorderLayout.PAGE_END); 

     frame.setContentPane(contentPane); 
     frame.pack(); 
     frame.setLocationByPlatform(true); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     Runnable r = new Runnable() { 
      @Override 
      public void run() { 
       new KeyBindingExample().displayGUI(); 
      } 
     }; 
     EventQueue.invokeLater(r); 
    } 
} 
+3

+1 für 'KeyBindings' &' SSCCE' – Reimeus