Detectar enter pressione em JTextField

103

É possível detectar quando alguém pressiona Enterao digitar um JTextField em java? Sem ter que criar um botão e defini-lo como padrão.

um sanduíche
fonte

Respostas:

168

A JTextFieldfoi projetado para usar ActionListenerexatamente como a JButtoné. Veja o addActionListener()método de JTextField.

Por exemplo:

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

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

Agora o evento é disparado quando a Enterchave é usada.

Além disso, um benefício adicional é que você pode compartilhar o ouvinte com um botão, mesmo se não quiser tornar o botão um botão padrão.

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

Observe que este exemplo usa um Action, que implementa ActionListenerporque Actioné uma API mais recente com recursos adicionais. Por exemplo, você pode desabilitar o Actionque desabilitaria o evento para o campo de texto e o botão.

camickr
fonte
1
Acordado. Solução mais elegante que a minha, no caso geral.
Kos
@camickr é um especialista em Java swings
Mohamed Iqzas
23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

tudo que você precisa fazer é adicionarActionListener ao JTextField como acima! Após pressionar Entera ação será realizada o que você deseja no extrato!

Kyorilys
fonte
16

Adicione um evento para 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
fonte
-1 :( KeyListeners são de nível muito baixo da perspectiva do Swing. Use a API que se destina a ser usada com o Swing :-)
nIcE cOw
1
@nIcEcOw KeyListeners são de nível muito baixo da perspectiva do Swing : CITATION NEEDED.
guido
2
@ ᴳᵁᴵᴰᴼ: Uma coisa muito bem documentada, pode ser encontrada nos tutoriais oficiais de KeyBindings , embora uma resposta muito boa sobre stackoverflow, também cobre o mesmo aspecto :-)
nIcE cOw
1
@nIcEcOw essa é exatamente a página de doc que eu tinha em mente. Acho muitas diferenças entre sugerir preferir ligações para atalhos e ações, usar apenas ouvintes para controlar o teclado em baixo nível e não usar porque é a API errada . A página do documento também não é tão preto e branco.
guido
1
@ ᴳᵁᴵᴰᴼ: KeyListenerstêm muitas deficiências, que são resolvidas em maior medida por KeyBindings, como, relacionado ao foco, relacionado ao copiar / colar e muitos mais. Deve ser evitado, para tarefas triviais, como, conforme solicitado no OP.
nIcE cOw
9

Você quer fazer algo assim?

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
fonte
1

Primeiro adicione o comando de ação em JButton ou JTextField por:

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

Em seguida, adicione ActionListener a JTextField e JButton.

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

Depois disso, On you ActionListener implementação de gravação

@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
fonte
1

As outras respostas (incluindo as aceitas) são boas, mas se você já usa Java8, você pode fazer o seguinte (de uma forma mais curta e mais recente):

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

Conforme a resposta aceita, você pode simplesmente reagir com um ActionListener, que captura a tecla Enter.

No entanto, minha abordagem se beneficia dos conceitos funcionais introduzidos no Java 8.

Se quiser usar a mesma ação, por exemplo, para um botão e o JTextField, você pode fazer o seguinte:

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

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

Se precisar de mais explicações, por favor me avise!

Thomas Böhm
fonte
0

Se você deseja definir uma ação de botão padrão em um JTextField enter, você deve fazer isto:

//put this after initComponents();

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

É [0] porque um botão pode ter várias ações, mas normalmente tem apenas uma (ActionPerformed).

alexcornejo
fonte
0

Para cada campo de texto em seu quadro, invoque o método addKeyListener. Em seguida, implemente e substitua o método keyPressed, como outros indicaram. Agora você pode pressionar Enter em qualquer campo do quadro para ativar sua ação.

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

Para escrever a lógica para 'Enter pressione' JTextField, é melhor manter a lógica dentro do keyReleased()bloco em vez de keyTyped()& keyPressed().

Avnish alok
fonte
1
-1 :( por repetir o mesmo erro novamente, que já foi rejeitado nas respostas anteriores, junto com o motivo especificado para o mesmo. KeyListenersSão de nível muito baixo da Swingperspectiva de. Use a API que se destina a ser usado com Swing :-)
nIcE cOw de
-3

Basta usar este código:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
iamprogrammer
fonte