Wykryj enter naciśnij w JTextField

103

Czy można wykryć, kiedy ktoś naciska Enterpodczas pisania w JTextField w java? Bez konieczności tworzenia przycisku i ustawiania go jako domyślnego.

kanapka
źródło

Odpowiedzi:

168

A JTextFieldzostał zaprojektowany do używania takiego ActionListenersamego jak a JButtonjest. Zobacz addActionListener()metodę JTextField.

Na przykład:

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

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

Teraz zdarzenie jest uruchamiane, gdy Enterklucz jest używany.

Dodatkową korzyścią jest to, że możesz udostępnić odbiornikowi przycisk, nawet jeśli nie chcesz, aby przycisk był przyciskiem domyślnym.

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

Należy zauważyć, że w tym przykładzie zastosowano Action, który implementuje, ActionListenerponieważ Actionjest nowszym interfejsem API z dodatkowymi funkcjami. Na przykład możesz wyłączyć to, Actionco wyłączyłoby zdarzenie zarówno dla pola tekstowego, jak i dla przycisku.

camickr
źródło
1
Zgoda. Bardziej eleganckie rozwiązanie niż moje, w ogólnym przypadku.
Kos
@camickr jest ekspertem od huśtawek w Javie
Mohamed Iqzas
23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

wszystko, co musisz zrobić, to dodaćActionListener do JTextField jak powyżej! Po naciśnięciu Enterakcja wykona to, co chcesz na wyciągu!

kyorilys
źródło
17

Dodaj wydarzenie dla 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
źródło
-1 :( KeyListenery są zdecydowanie za niskie z punktu widzenia Swinga. Użyj API, które jest przeznaczone do użytku z
Swingiem
1
@nIcEcOw KeyListenery to zdecydowanie za niski poziom z perspektywy Swinga : POTRZEBNA JEST CYTACJA .
guido
2
@ ᴳᵁᴵᴰᴼ: Bardzo dobrze udokumentowana rzecz, którą można znaleźć w oficjalnych samouczkach KeyBindings , chociaż bardzo dobra odpowiedź na temat stackoverflow, obejmuje również ten sam aspekt :-)
NIcE cOw
1
@nIcEcOw to jest dokładnie ta strona dokumentu, o której myślałem. Znajduję dużą różnicę między sugerowaniem preferowania powiązań dla skrótów i akcji, używam słuchaczy tylko do kontrolowania klawiatury na niskim poziomie , a nie używam, ponieważ jest to zły interfejs API . Strona dokumentu też nie jest tak czarno-biała.
guido
1
@ ᴳᵁᴵᴰᴼ: KeyListenersma wiele niedociągnięć, które są usuwane w większym stopniu przez KeyBindings, takie jak związane z fokusem, związane z kopiowaniem / wklejaniem i wiele innych. Należy go unikać w przypadku błahych zadań, takich jak zadane w PO.
nIcE cOw
9

Chcesz zrobić coś takiego?

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
źródło
1

Najpierw dodaj polecenie akcji na JButton lub JTextField przez:

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

Następnie dodaj ActionListener do JTextField i JButton.

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

Następnie napiszesz o implementacji 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
źródło
1

Pozostałe odpowiedzi (w tym zaakceptowane) są dobre, ale jeśli korzystasz już z Java8, możesz wykonać następujące czynności (w krótszy, nowszy sposób):

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

Zgodnie z przyjętą odpowiedzią możesz po prostu zareagować ActionListener, naciskając klawisz Enter.

Jednak moje podejście wykorzystuje koncepcje funkcjonalne, które zostały wprowadzone w Javie 8.

Jeśli chcesz użyć tej samej akcji, na przykład dla przycisku i JTextField, możesz wykonać następujące czynności:

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

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

Jeśli potrzebne są dalsze wyjaśnienia, daj mi znać!

Thomas Böhm
źródło
0

Jeśli chcesz ustawić domyślną akcję przycisku w enter JTextField, musisz to zrobić:

//put this after initComponents();

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

Jest to [0], ponieważ przycisk może mieć wiele akcji, ale zwykle ma tylko jedną (ActionPerformed).

alexcornejo
źródło
0

Dla każdego pola tekstowego w ramce wywołaj metodę addKeyListener. Następnie zaimplementuj i nadpisz metodę keyPressed, jak wskazali inni. Teraz możesz nacisnąć enter w dowolnym polu w ramce, aby aktywować akcję.

@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }
Debra
źródło
-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();                     
        }
    }

Aby zapisać logikę dla „Enter, naciśnij” JTextField, lepiej jest zachować logikę wewnątrz keyReleased()bloku zamiast keyTyped()& keyPressed().

Avnish alok
źródło
1
-1 :( za ponowne powtórzenie tego samego błędu, który został już poddany głosowaniu w dół w poprzednich odpowiedziach, wraz z podanym powodem tego samego. KeyListenersZ Swingpunktu widzenia jest to zdecydowanie zbyt niski poziom . Użyj API, które ma być używany z Swing :-)
nIcE cOw
-3

Po prostu użyj tego kodu:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
iamprogrammer
źródło