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.

sebuah sandwhich
sumber

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.

camickr.dll
sumber
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!

kyorilys.dll
sumber
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.
   }
} 
Ionică Bizău
sumber
-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();
            }
        }

    });
diegod3v
sumber
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
    }
}
greg
sumber
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!

Thomas Böhm
sumber
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).

alexcornejo
sumber
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
            }
        }
Debra
sumber
-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().

Avnish alok
sumber
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);
iamprogrammer
sumber