Deteksi tekan enter di JTextField


103

Apakah mungkin untuk mendeteksi ketika seseorang menekan Entersaat mengetik di JTextField di java? Tanpa harus membuat tombol dan mengaturnya sebagai default.

Jawaban:


168

Sebuah JTextFielddirancang untuk menggunakan ActionListenerhanya seperti JButtonini. Lihat addActionListener()metode JTextField.

Sebagai contoh:

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

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

Sekarang acara tersebut dijalankan saat Enterkunci digunakan.

Selain itu, manfaat tambahannya adalah Anda dapat membagikan pendengar dengan sebuah tombol meskipun Anda tidak ingin menjadikan tombol tersebut sebagai tombol default.

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

Perhatikan, contoh ini menggunakan Action, yang mengimplementasikan ActionListenerkarena Actionmerupakan API yang lebih baru dengan fitur tambahan. Misalnya Anda dapat menonaktifkan Actionyang akan menonaktifkan acara untuk bidang teks dan tombol.


1
Sepakat. Solusi yang lebih elegan dari saya, dalam kasus umum.
Kos

@camickr adalah pakar ayunan Java
Mohamed Iqzas

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

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

yang perlu Anda lakukan hanyalah menambahkanActionListener ke JTextField seperti di atas! Setelah Anda menekan Entertindakan akan dilakukan apa yang Anda inginkan pada pernyataan itu!


16

Tambahkan acara untuk KeyPressed.

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

-1 :( KeyListeners adalah level yang terlalu rendah dari perspektif Swing. Gunakan API yang dimaksudkan untuk digunakan dengan Swing :-)
nIcE cOw

1
@nIcEcOw KeyListeners adalah level yang terlalu rendah dari perspektif Swing : CITATION NEEDED.
guido

2
@ ᴳᵁᴵᴰᴼ: Hal yang terdokumentasi dengan sangat baik, dapat ditemukan di tutorial resmi KeyBindings , meskipun jawaban yang sangat bagus tentang stackoverflow, juga mencakup aspek yang sama :-)
nIcE cOw

1
@nIcEcOw itulah halaman dokumen yang ada dalam pikiran saya. Saya menemukan banyak perbedaan antara menyarankan untuk memilih binding untuk pintasan dan tindakan, hanya menggunakan pendengar untuk mengontrol keyboard pada level rendah , dan jangan gunakan karena itu api yang salah . Halaman dokumen juga tidak terlalu hitam-putih.
guido

1
@ ᴳᵁᴵᴰᴼ: KeyListenersmemiliki banyak kekurangan, yang diurus oleh KeyBindings, seperti, terkait fokus, terkait salin / tempel, dan banyak lagi. Itu harus dihindari, untuk tugas-tugas sepele seperti yang ditanyakan di OP.
SEBELUMNYA

9

Apakah Anda ingin melakukan sesuatu seperti ini?

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

Pertama tambahkan perintah tindakan pada JButton atau JTextField dengan:

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

Kemudian tambahkan ActionListener ke JTextField dan JButton.

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

Setelah itu, tulis implementasi On You ActionListener

@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

Jawaban lain (termasuk yang diterima) bagus, tetapi jika Anda sudah menggunakan Java8, Anda dapat melakukan hal berikut (dengan cara yang lebih singkat dan lebih baru):

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

Seperti jawaban yang diterima, Anda cukup bereaksi dengan ActionListener, yang menangkap Enter-Key.

Namun, pendekatan saya memanfaatkan konsep fungsional yang diperkenalkan di Java 8.

Jika Anda ingin menggunakan tindakan yang sama misalnya untuk tombol dan JTextField, Anda dapat melakukan hal berikut:

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

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

Jika perlu penjelasan lebih lanjut, beri tahu saya!


0

Jika Anda ingin menyetel aksi tombol default di JTextField enter, Anda harus melakukan ini:

//put this after initComponents();

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

Ini [0] karena sebuah tombol dapat memiliki banyak tindakan, tetapi biasanya hanya memiliki satu tindakan (ActionPerformed).


0

Untuk setiap bidang teks dalam bingkai Anda, aktifkan metode addKeyListener. Kemudian terapkan dan timpa metode keyPressed, seperti yang ditunjukkan orang lain. Sekarang Anda dapat menekan enter dari bidang mana pun di bingkai Anda untuk mengaktifkan tindakan Anda.

@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();                     
        }
    }

Untuk menulis logika untuk 'Enter press' JTextField, lebih baik menyimpan logika di dalam keyReleased()blok daripada keyTyped()& keyPressed().


1
-1 :( untuk mengulangi kesalahan yang sama lagi, yang telah ditolak pada jawaban sebelumnya, bersama dengan alasan yang ditentukan untuk hal yang sama. KeyListenersAdalah tingkat yang terlalu rendah dari Swingperspektif. Gunakan API yang dimaksudkan untuk digunakan dengan Swing :-)
nIcE cOw

-3

Cukup gunakan kode ini:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.