2013-08-28 32 views
7

Khi tôi nhấn ENTER JTextArea của tôi bắt đầu một hàng mới và tôi chỉ muốn làm với phương thức doClick() không có gì khác. Tôi nên làm như thế nào?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

không sử dụng keyListeners ở tất cả (tự hỏi làm thế nào mã của bạn có thể có thể làm việc: bạn có _focusable_ nhãn? Làm thế nào lạ và người dùng khó hiểu ...) - sử dụng keyBindings – kleopatra

Trả lời

7

Sử dụng .consume():

Tiêu thụ sự kiện này để nó sẽ không được xử lý theo cách mặc định bởi nguồn mà nguồn gốc nó.

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

Documentation

+0

Cảm ơn bạn nó đã làm việc. –

+0

@ PéterSzakács Tuyệt vời! Mừng vì tôi có thể giúp. –

+1

Không sử dụng Trình nghe phím. Swing được thiết kế để sử dụng với Key Bindings. – camickr

7

Bạn nên sử dụng với bất kỳ KeyBindingsJTextComponent trong câu hỏi. KeyListeners là mức quá thấp so với quan điểm của Swing. Bạn đang sử dụng các khái niệm mà có liên quan đến AWT, Swing sử dụng KeyBindings để làm cùng một công việc có hiệu quả hơn và cung cấp kết quả mong muốn :-)

Một chương trình nhỏ giúp đỡ của bạn:

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

Các vấn đề liên quan