JTextField'da enter tuşuna basın


103

EnterJava'da bir JTextField yazarken birinin bastığını algılamak mümkün mü ? Bir düğme oluşturmak ve varsayılan olarak ayarlamak zorunda kalmadan.

Yanıtlar:


168

A JTextField, ActionListenertıpkı a JButtonolduğu gibi kullanmak üzere tasarlanmıştır . addActionListener()Yöntemine bakın JTextField.

Örneğin:

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

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

Artık Enteranahtar kullanıldığında olay tetikleniyor .

Ayrıca, ek bir avantaj, düğmeyi varsayılan düğme yapmak istemeseniz bile dinleyiciyi bir düğmeyle paylaşabilmenizdir.

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

Not: Bu örnek, bir kullanır Action, ki uygular ActionListener, çünkü Actionek özelliklere sahip yeni bir API'dır. Örneğin Action, etkinliği hem metin alanı hem de düğme için devre dışı bırakacak olanı devre dışı bırakabilirsiniz.


1
Kabul. Genel olarak benimkinden daha zarif bir çözüm.
Kos

@camickr Java salınımlarının uzmanı
Mohamed Iqzas

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

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

Tüm yapmanız gereken yukarıdaki gibi JTextField'e addActionListener'ı eklemek! EnterEylem bastıktan sonra ifadede istediğinizi gerçekleştirecektir!


17

İçin bir etkinlik ekleyin KeyPressed.

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

-1 :( KeyListeners, Swing'in bakış açısından çok düşük düzeydedir. Swing ile kullanılması amaçlanan API'yi kullanın :-)
nIcE cOw

1
@nIcEcOw KeyListeners, Swing'in bakış açısından çok düşük düzeydedir : CITATION GEREKLİ.
guido

2
@ ᴳᵁᴵᴰᴼ: Çok iyi belgelenmiş bir şey, KeyBindings'in resmi öğreticilerinde bulunabilir , ancak yığın aşımı hakkında çok iyi bir yanıt da aynı yönü kapsar :-)
nIcE cOw

1
@nIcEcOw tam da aklımdaki belge sayfası. Ben düşündüren arasındaki fark bir sürü bulabilirsiniz yalnızca düşük seviyede klavye kontrol etmek için dinleyicileri kullanmak, kısayollar ve eylemler için bağlamaları tercih ve yanlış API çünkü kullanmayın . Doküman sayfası da o kadar siyah-beyaz değil.
guido

1
@ ᴳᵁᴵᴰᴼ: Odakla ilgili, kopyala / yapıştır ile ilgili ve daha pek çok şey KeyListenerstarafından büyük ölçüde giderilen birçok eksikliğe sahip KeyBindings. OP'de sorulduğu gibi önemsiz görevler için bundan kaçınılmalıdır.
nIcE cOw

9

Böyle bir şey yapmak ister misin?

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

Önce JButton veya JTextField'a eylem komutunu ekleyin:

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

Ardından hem JTextField hem de JButton'a ActionListener ekleyin.

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

Bundan sonra, On you ActionListener uygulaması

@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

Diğer cevaplar (kabul edilenler dahil) iyidir, ancak zaten Java8 kullanıyorsanız, aşağıdakileri yapabilirsiniz (daha kısa, daha yeni bir şekilde):

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

Kabul edilen cevabın söylediği gibi, ActionListenerEnter-Tuşunu yakalayan bir ile basitçe tepki verebilirsiniz .

Ancak benim yaklaşımım Java 8'de tanıtılan işlevsel kavramlardan yararlanıyor.

Örneğin bir düğme ve JTextField için aynı eylemi kullanmak istiyorsanız, aşağıdakileri yapabilirsiniz:

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

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

Daha fazla açıklama gerekiyorsa lütfen bana bildirin!


0

Bir JTextField girişinde varsayılan bir düğme eylemi ayarlamak istiyorsanız, bunu yapmanız gerekir:

//put this after initComponents();

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

Bu [0], çünkü bir düğmenin birçok eylemi olabilir, ancak normalde yalnızca bir tane vardır (ActionPerformed).


0

Çerçevenizdeki her metin alanı için addKeyListener yöntemini çağırın. Ardından, diğerlerinin de belirttiği gibi keyPressed yöntemini uygulayın ve geçersiz kılın. Artık eyleminizi etkinleştirmek için çerçevenizdeki herhangi bir alandan enter tuşuna basabilirsiniz.

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

'Enter tuşuna basın' mantığını yazmak için JTextField, mantığı & keyReleased()yerine bloğun içinde tutmak daha iyidir .keyTyped()keyPressed()


1
-1 :( zaten olmuştur ki, yine aynı hatayı tekrar aynı için belirtilen nedenden birlikte önceki cevapları aşağı oy verdi. KeyListenersDan yol çok düşük düzeyde olan Swingperspektifinden. Olması amaçlanmıştır API kullanın Swing :-) ile kullanılır
nIcE cOw

-3

Sadece şu kodu kullanın:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.