Détecter entrer appuyez sur JTextField

103

Est-il possible de détecter quand quelqu'un appuie sur Enteren tapant un JTextField en java? Sans avoir à créer un bouton et à le définir par défaut.

un sandwich
la source

Réponses:

168

A a JTextFieldété conçu pour utiliser un ActionListenercomme un JButtonest. Voir la addActionListener()méthode de JTextField.

Par exemple:

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

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

Maintenant, l'événement est déclenché lorsque la Enterclé est utilisée.

En outre, un avantage supplémentaire est que vous pouvez partager l'auditeur avec un bouton même si vous ne souhaitez pas en faire un bouton par défaut.

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

Notez que cet exemple utilise un Action, qui implémente ActionListenercar Actionest une API plus récente avec des fonctionnalités supplémentaires. Par exemple, vous pouvez désactiver le Actionqui désactiverait l'événement à la fois pour le champ de texte et le bouton.

camickr
la source
1
D'accord. Solution plus élégante que la mienne, dans le cas général.
Kos
@camickr est un expert des balançoires Java
Mohamed Iqzas
23
JTextField function=new JTextField(8);   
function.addActionListener(new ActionListener(){

                public void actionPerformed(ActionEvent e){

                        //statements!!!

                }});

tout ce que vous avez à faire est d'ajouterActionListener au JTextField comme ci-dessus! Après avoir appuyé sur, Enterl'action exécutera ce que vous voulez à l'instruction!

kyorilys
la source
17

Ajoutez un événement pour 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
la source
-1 :( Les ​​KeyListeners sont bien trop bas du point de vue de Swing. Utilisez l'API qui est destinée à être utilisée avec Swing :-)
nIcE cOw
1
Les KeyListeners @nIcEcOw sont bien trop bas du point de vue de Swing : CITATION REQUISE.
guido
2
@ ᴳᵁᴵᴰᴼ: Un truc très bien documenté, peut être trouvé dans les tutoriels officiels de KeyBindings , bien qu'une très bonne réponse sur stackoverflow, couvre également le même aspect :-)
nIcE cOw
1
@nIcEcOw c'est exactement la page doc que j'avais en tête. Je trouve beaucoup de différence entre suggérer de préférer les liaisons pour les raccourcis et les actions, n'utiliser que des écouteurs pour contrôler le clavier à bas niveau et ne pas utiliser parce que c'est la mauvaise API . La page doc n'est pas non plus en noir et blanc.
guido
1
@ ᴳᵁᴵᴰᴼ: KeyListenersprésentent de nombreuses lacunes, qui sont dans une plus grande mesure comblées KeyBindings, telles que la mise au point, le copier / coller et bien d'autres. Il est à éviter, pour des tâches triviales, telles que, comme demandé dans OP.
VOIR NICE
9

Voulez-vous faire quelque chose comme ça?

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
la source
1

Ajoutez d'abord la commande d'action sur JButton ou JTextField en:

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

Ajoutez ensuite ActionListener à JTextField et JButton.

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

Après cela, sur votre implémentation ActionListener, écrivez

@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
la source
1

Les autres réponses (y compris celles acceptées) sont bonnes, mais si vous utilisez déjà Java8, vous pouvez faire ce qui suit (d'une manière plus courte et plus récente):

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

Comme le dit la réponse acceptée, vous pouvez simplement réagir avec un ActionListener , qui attrape la touche Entrée.

Cependant, mon approche tire parti des concepts fonctionnels qui ont été introduits dans Java 8.

Si vous souhaitez utiliser la même action, par exemple pour un bouton et le JTextField, vous pouvez effectuer les opérations suivantes:

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

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

Si des explications supplémentaires sont nécessaires, veuillez me le faire savoir!

Thomas Böhm
la source
0

Si vous souhaitez définir une action de bouton par défaut dans une entrée JTextField, vous devez le faire:

//put this after initComponents();

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

C'est [0] parce qu'un bouton peut avoir beaucoup d'actions, mais n'en a normalement qu'une (ActionPerformed).

alexcornejo
la source
0

Pour chaque champ de texte de votre cadre, appelez la méthode addKeyListener. Ensuite, implémentez et remplacez la méthode keyPressed, comme d'autres l'ont indiqué. Vous pouvez maintenant appuyer sur Entrée à partir de n'importe quel champ de votre cadre pour activer votre action.

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

Pour écrire une logique pour «Enter press» JTextField, il est préférable de conserver la logique à l'intérieur du keyReleased()bloc au lieu de keyTyped()& keyPressed().

Avnish alok
la source
1
-1 :( pour répéter la même erreur, qui a déjà été votée à la baisse dans les réponses précédentes, ainsi que la raison spécifiée pour la même chose. KeyListenersSont bien trop bas du Swingpoint de vue de. Utilisez l'API qui est censée être utilisé avec Swing :-)
nIcE cOw
-3

Utilisez simplement ce code:

SwingUtilities.getRootPane(myButton).setDefaultButton(myButton);
programmeur
la source