Phát hiện nhấn enter trong JTextField


103

Có thể phát hiện khi ai đó nhấn Entertrong khi nhập JTextField trong java không? Mà không cần phải tạo một nút và đặt nó làm mặc định.

Câu trả lời:


168

A JTextFieldđược thiết kế để sử dụng ActionListenergiống như một JButton. Xem addActionListener()phương pháp của JTextField.

Ví dụ:

Action action = new AbstractAction()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        System.out.println("some action");
    }
};

JTextField textField = new JTextField(10);
textField.addActionListener( action );

Bây giờ sự kiện được kích hoạt khi Enterkhóa được sử dụng.

Ngoài ra, một lợi ích bổ sung là bạn có thể chia sẻ trình nghe bằng một nút ngay cả khi bạn không muốn đặt nút này thành nút mặc định.

JButton button = new JButton("Do Something");
button.addActionListener( action );

Lưu ý, ví dụ này sử dụng một Action, thực thi ActionListenerActionlà một API mới hơn với các tính năng bổ sung. Ví dụ: bạn có thể tắt tùy chọn Actionnày sẽ vô hiệu hóa sự kiện cho cả trường văn bản và nút.


1
Đã đồng ý. Giải pháp thanh lịch hơn của tôi, trong trường hợp chung.
Kos

@camickr là một chuyên gia của Java đu
Mohamed Iqzas

23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

tất cả những gì bạn cần làm là addActionListener vào JTextField như trên! Sau khi bạn nhấn Enterhành động sẽ thực hiện những gì bạn muốn ở câu lệnh!


16

Thêm một sự kiện cho KeyPressed.

private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) {
  if(evt.getKeyCode() == KeyEvent.VK_ENTER) {
      // Enter was pressed. Your code goes here.
   }
} 

-1 :( KeyListeners là mức quá thấp từ quan điểm của Swing Sử dụng các API mà được thiết kế để được sử dụng với Swing :-).
thoải mái bò

1
@nIcEcOw KeyListists là cấp quá thấp theo quan điểm của Swing : CITATION CẦN.
Guido

2
@ ᴳᵁᴵᴰᴼ: Một điều được ghi chép rất đầy đủ, có thể được tìm thấy tại các hướng dẫn chính thức của KeyBindings , mặc dù một câu trả lời rất hay về stackoverflow, cũng bao gồm cùng một khía cạnh :-)
nIcE cOw

1
@nIcEcOw đó chính xác là trang tài liệu mà tôi đã nghĩ đến. Tôi nhận thấy có rất nhiều sự khác biệt giữa việc đề xuất ưu tiên các ràng buộc cho các phím tắt và hành động, chỉ sử dụng trình nghe để điều khiển bàn phím ở mức thấpkhông sử dụng vì đó là api sai . Trang tài liệu cũng không phải là trang đen trắng.
Guido

1
@ ᴳᵁᴵᴰᴼ: KeyListenerscó nhiều thiếu sót, được chăm sóc ở mức độ lớn hơn KeyBindings, chẳng hạn như liên quan đến tiêu điểm, liên quan đến sao chép / dán và nhiều hơn nữa. Nó phải được tránh, đối với các nhiệm vụ nhỏ, chẳng hạn như, như được yêu cầu trong OP.
nIcE cOw

9

Bạn có muốn làm điều gì đó như thế này không?

JTextField mTextField = new JTextField();
    mTextField.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                // something like...
               //mTextField.getText();
               // or...
               //mButton.doClick();
            }
        }

    });

1

Đầu tiên hãy thêm lệnh hành động trên JButton hoặc JTextField bằng cách:

JButton.setActionCommand("name of command");
JTextField.setActionCommand("name of command");

Sau đó, thêm ActionListener vào cả JTextField và JButton.

JButton.addActionListener(listener);
JTextField.addActionListener(listener);

Sau đó, về việc triển khai ActionListener của bạn, hãy viết

@Override
public void actionPerformed(ActionEvent e)
{
    String actionCommand = e.getActionCommand();

    if(actionCommand.equals("Your actionCommand for JButton") || actionCommand.equals("Your   actionCommand for press Enter"))
    {
        //Do something
    }
}

1

Các câu trả lời khác (bao gồm cả những câu được chấp nhận) là tốt, nhưng nếu bạn đã sử dụng Java8, bạn có thể làm như sau (theo cách ngắn hơn, mới hơn):

textField.addActionListener(
    ae -> {
        //dostuff
    }
);

Như câu trả lời được chấp nhận đã nói, bạn có thể chỉ cần phản ứng với một ActionListener, bắt được phím Enter.

Tuy nhiên, cách tiếp cận của tôi có lợi từ các khái niệm chức năng đã được giới thiệu trong Java 8.

Nếu bạn muốn sử dụng cùng một hành động, chẳng hạn cho một nút và JTextField, bạn có thể làm như sau:

ActionListener l = ae -> {
    //do stuff
}

button.addActionListener(l);
textField.addActionListener(l);

Nếu cần giải thích thêm, vui lòng cho tôi biết!


0

Nếu bạn muốn đặt một hành động nút mặc định trong một lần nhập JTextField, bạn phải thực hiện điều này:

//put this after initComponents();

textField.addActionListener(button.getActionListeners()[0]);

Đó là [0] vì một nút có thể có nhiều hành động, nhưng thông thường chỉ có một (ActionPerformed).


0

Đối với mỗi trường văn bản trong khung của bạn, hãy gọi phương thức addKeyListener. Sau đó triển khai và ghi đè phương thức keyPressed, như những phương thức khác đã chỉ ra. Bây giờ bạn có thể nhấn enter từ bất kỳ trường nào trong khung để kích hoạt hành động của mình.

@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }

-2
public void keyReleased(KeyEvent e)
{
    int key=e.getKeyCode();
    if(e.getSource()==textField)
    {
        if(key==KeyEvent.VK_ENTER)
        { 
            Toolkit.getDefaultToolkit().beep();
            textField_1.requestFocusInWindow();                     
        }
    }

Để viết logic cho 'Enter nhấn' trong JTextField, tốt hơn là giữ logic bên trong keyReleased()khối thay vì keyTyped()& keyPressed().


1
-1 :( vì lặp lại cùng một lỗi đã bị bỏ phiếu trong các câu trả lời trước đó, cùng với lý do được chỉ định cho cùng một lý do. KeyListenersLà mức độ quá thấp Swingtheo quan điểm của. Hãy sử dụng API dự định được sử dụng với Swing :-)
nIcE cOw

-3

Chỉ cần sử dụng mã này:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.