Detectar entrar presione en JTextField

103

¿Es posible detectar cuando alguien presiona Entermientras escribe un JTextField en java? Sin tener que crear un botón y configurarlo como predeterminado.

un sándwich
fuente

Respuestas:

168

A JTextFieldfue diseñado para usar un ActionListenertal como JButtones. Vea el addActionListener()método de JTextField.

Por ejemplo:

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

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

Ahora el evento se dispara cuando Enterse usa la clave.

Además, un beneficio adicional es que puede compartir el oyente con un botón incluso si no desea que el botón sea un botón predeterminado.

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

Tenga en cuenta que este ejemplo usa un Action, que se implementa ActionListenerporque Actiones una API más nueva con características adicionales. Por ejemplo, podría deshabilitar Actionlo que deshabilitaría el evento tanto para el campo de texto como para el botón.

camickr
fuente
1
Convenido. Solución más elegante que la mía, en el caso general.
Kos
@camickr es un experto en swings de Java
Mohamed Iqzas
23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

¡todo lo que necesita hacer es agregarActionListener al JTextField como arriba! Después de presionar, Enterla acción realizará lo que desee en el estado de cuenta.

kyorilys
fuente
16

Agrega un 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
fuente
-1 :( Los KeyListeners tienen un nivel demasiado bajo desde la perspectiva de Swing. Use la API que está destinada a usarse con Swing :-)
nIcE cOw
1
@nIcEcOw KeyListeners tienen un nivel demasiado bajo desde la perspectiva de Swing : SE NECESITA UNA CITA .
guido
2
@ ᴳᵁᴵᴰᴼ: Una cosa muy bien documentada, se puede encontrar en los tutoriales oficiales de KeyBindings , aunque una muy buena respuesta en stackoverflow, también cubre el mismo aspecto :-)
nIcE cOw
1
@nIcEcOw esa es exactamente la página de documentos que tenía en mente. Encuentro una gran diferencia entre sugerir preferir enlaces para atajos y acciones, usar solo oyentes para controlar el teclado a bajo nivel y no usar porque es la API incorrecta . La página del documento tampoco es tan en blanco y negro.
guido
1
@ ᴳᵁᴵᴰᴼ: KeyListenerstienen muchas deficiencias, de las que se solucionan en mayor medida KeyBindings, como las relacionadas con el enfoque, las relacionadas con copiar / pegar y muchas muchas más. Debe evitarse, para tareas triviales, como, como se pide en OP.
nIcE cOw
9

¿Quieres hacer algo como esto?

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

Primero agregue el comando de acción en JButton o JTextField por:

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

Luego agregue ActionListener tanto a JTextField como a JButton.

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

Después de eso, en tu implementación de ActionListener escribe

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

Las otras respuestas (incluidas las aceptadas) son buenas, pero si ya usa Java8, puede hacer lo siguiente (de una manera más corta y nueva):

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

Como dice la respuesta aceptada, simplemente puede reaccionar con un ActionListener, que captura la tecla Enter.

Sin embargo, mi enfoque se beneficia de los conceptos funcionales que se introdujeron en Java 8.

Si desea utilizar la misma acción, por ejemplo, para un botón y JTextField, puede hacer lo siguiente:

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

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

Si necesita más explicaciones, ¡hágamelo saber!

Thomas Böhm
fuente
0

Si desea establecer una acción de botón predeterminada en una entrada de JTextField, debe hacer esto:

//put this after initComponents();

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

Es [0] porque un botón puede tener muchas acciones, pero normalmente solo tiene una (ActionPerformed).

alexcornejo
fuente
0

Para cada campo de texto de su marco, invoque el método addKeyListener. Luego implemente y anule el método keyPressed, como otros han indicado. Ahora puede presionar enter desde cualquier campo en su marco para activar su acción.

@Override
        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode() == KeyEvent.VK_ENTER){
                //perform action
            }
        }
Debra
fuente
-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 escribir la lógica para 'Enter press' JTextField, es mejor mantener la lógica dentro del keyReleased()bloque en lugar de keyTyped()& keyPressed().

Avnish alok
fuente
1
-1 :( por repetir el mismo error nuevamente, que ya ha sido rechazado en las respuestas anteriores, junto con la razón especificada para el mismo. KeyListenersSon de un nivel demasiado bajo desde Swingla perspectiva de. Use la API que está destinada a ser usado con Swing :-)
nIcE cOw
-3

Solo usa este código:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
programador
fuente