2013-08-28 23 views
7

Po naciśnięciu ENTER mój JTextArea rozpoczyna nowy wiersz i chcę tylko zrobić do metody doClick() nic więcej. Jak mam to zrobić?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

nie korzystają keyListeners (zastanawiasz się, jak może działać Twój kod: masz _focusable_ labels? Jak dziwne i kłopotliwe dla użytkownika ...) - użyj keyBindings – kleopatra

Odpowiedz

7

Zastosowanie .consume():

Zużywa to wydarzenie tak, że nie będą przetwarzane w sposób domyślny przez źródła, które to powstały.

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

Documentation

+0

Dziękuję, że zadziałało. –

+0

@ PéterSzakács Doskonale! Cieszę się, że mogłem pomóc. –

+1

Nie używaj odbiornika kluczy. Swing został zaprojektowany do użycia z kluczowymi powiązaniami. – camickr

7

Należy użyć KeyBindings z dowolnym JTextComponent mowa. KeyListeners są zdecydowanie zbyt niskie z perspektywy Swing. Używasz pojęcia co wiązało się AWT, Swing wykorzystuje KeyBindings zrobić to samo zadanie z większą wydajnością i zapewnia pożądanych wyników :-)

mały program za pomoc:

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