Rileva invio stampa in JTextField


103

È possibile rilevare quando qualcuno preme Enterdurante la digitazione in un JTextField in java? Senza dover creare un pulsante e impostarlo come predefinito.

Risposte:


168

A è JTextFieldstato progettato per utilizzare un ActionListenerproprio come JButtonè. Vedi il addActionListener()metodo di JTextField.

Per esempio:

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

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

Ora l'evento viene generato quando Enterviene utilizzata la chiave.

Inoltre, un ulteriore vantaggio è che puoi condividere l'ascoltatore con un pulsante anche se non vuoi rendere il pulsante un pulsante predefinito.

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

Nota, questo esempio utilizza un Action, che implementa ActionListenerperché Actionè un'API più recente con funzionalità aggiuntive. Ad esempio potresti disabilitare il Actionche disabiliterà l'evento sia per il campo di testo che per il pulsante.


1
Concordato. Soluzione più elegante della mia, nel caso generale.
Kos

@camickr è un esperto di Java swing
Mohamed Iqzas

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

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

tutto quello che devi fare è aggiungereActionListener a JTextField come sopra! Dopo aver premuto, Enterl'azione eseguirà ciò che desideri nell'istruzione!


16

Aggiungi un evento per KeyPressed.

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

-1 :( I KeyListeners sono di livello troppo basso dal punto di vista di Swing. Usa l'API che dovrebbe essere usata con Swing :-)
nIcE cOw

1
@nIcEcOw KeyListeners sono di livello troppo basso dal punto di vista di Swing : CITAZIONE NECESSARIA.
guido

2
@ ᴳᵁᴵᴰᴼ: Una cosa molto ben documentata, può essere trovata nei tutorial ufficiali di KeyBindings , anche se un'ottima risposta su stackoverflow, copre anche lo stesso aspetto :-)
nIcE cOw

1
@nIcEcOw è esattamente la pagina del documento che avevo in mente. Trovo molta differenza tra suggerire di preferire le associazioni per scorciatoie e azioni, utilizzare solo ascoltatori per controllare la tastiera a basso livello e non utilizzare perché è l'API sbagliata . Anche la pagina del documento non è così in bianco e nero.
guido

1
@ ᴳᵁᴵᴰᴼ: KeyListenershanno molti difetti, che vengono risolti in misura maggiore da KeyBindings, ad esempio, relativi al focus, relativi al copia / incolla e molti molti altri. È da evitare, per compiti banali, come, come richiesto in OP.
nIcE cOw

9

Vuoi fare qualcosa di simile?

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

Per prima cosa aggiungi il comando di azione su JButton o JTextField da:

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

Quindi aggiungi ActionListener sia a JTextField che a JButton.

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

Dopodiché, scrivi su di te l'implementazione di 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
    }
}

1

Le altre risposte (comprese quelle accettate) sono buone, ma se usi già Java8, puoi fare quanto segue (in un modo più breve, più nuovo):

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

Come diceva la risposta accettata, puoi semplicemente reagire con un ActionListener, che cattura il tasto Invio.

Tuttavia, il mio approccio trae vantaggio dai concetti funzionali introdotti in Java 8.

Se desideri utilizzare la stessa azione, ad esempio, per un pulsante e JTextField, puoi eseguire le seguenti operazioni:

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

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

Se sono necessarie ulteriori spiegazioni, fatemelo sapere!


0

Se vuoi impostare un'azione predefinita del pulsante in un ingresso JTextField, devi farlo:

//put this after initComponents();

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

È [0] perché un pulsante può avere molte azioni, ma normalmente ne ha solo una (ActionPerformed).


0

Per ogni campo di testo nel frame, richiama il metodo addKeyListener. Quindi implementare e sovrascrivere il metodo keyPressed, come altri hanno indicato. Ora puoi premere Invio da qualsiasi campo nel riquadro per attivare la tua azione.

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

Per scrivere la logica per "premere Invio" in JTextField, è meglio mantenere la logica all'interno del keyReleased()blocco invece di keyTyped()& keyPressed().


1
-1 :( per aver ripetuto di nuovo lo stesso errore, che è già stato sconsigliato nelle risposte precedenti, insieme al motivo specificato per lo stesso. KeyListenersSono di livello troppo basso dal Swingpunto di vista di. Utilizza l'API che è intesa per essere usato con Swing :-)
nIcE COw

-3

Usa questo codice:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.