2013-08-28 16 views
7

Quando ho premuto il tasto INVIO, il mio JTextArea avvia una nuova riga e voglio solo eseguire il metodo doClick() nient'altro. Come dovrei farlo?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

non utilizzano keyListeners (chiedendo come può funzionare il tuo codice: hai _focusable_ labels? Che strano e user-confusion ...) - usa keyBindings – kleopatra

risposta

7

Uso .consume():

consuma questo evento in modo che non saranno trattati in modo predefinito dalla sorgente che ha originato.

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

Documentation

+0

Grazie. –

+0

@ PéterSzakács Eccellente! Sono contento di poterti aiutare. –

+1

Non utilizzare un listener di chiavi. Swing è stato progettato per essere utilizzato con Key Bindings. – camickr

7

Si dovrebbe usare KeyBindings con qualsiasi JTextComponent in questione. KeyListeners sono di livello troppo basso dal punto di vista di Swing. Si utilizza il concetto che è stato legato alla AWT, Swing utilizza KeyBindings a fare lo stesso compito con maggiore efficienza e fornisce i risultati desiderati :-)

Un piccolo programma per il vostro aiuto:

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 per 'KeyBindings' &' SSCCE' – Reimeus