web-dev-qa-db-fra.com

Permettre à la touche "Entrée" d'appuyer sur le bouton d'envoi, au lieu d'utiliser uniquement MouseClick

J'apprends le cours de swing maintenant et tout ce qui s'y rapporte. J'ai un programme de jouets que je compose et qui demande un nom, puis présente un JOptionPane avec le message "Vous avez entré (Votre nom)" . Le bouton d'envoi que j'utilise peut uniquement être cliqué , mais j'aimerais que cela fonctionne avec le bouton Entrée aussi. J'ai essayé d'ajouter un KeyListener, comme recommandé dans le livre Java que j'utilise (Eventful Java, Bruce Danyluk et Murtagh).

NamePromptenter image description here

Ceci est mon code:

import Java.awt.BorderLayout;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class NamePrompt extends JFrame{


    private static final long serialVersionUID = 1L;

    String name;

    public NamePrompt(){

        setLayout(new BorderLayout());

        JLabel enterYourName = new JLabel("Enter Your Name Here:");
        JTextField textBoxToEnterName = new JTextField(21);
        JPanel panelTop = new JPanel();
        panelTop.add(enterYourName);
        panelTop.add(textBoxToEnterName);

        JButton submit = new JButton("Submit");
        submit.addActionListener(new SubmitButton(textBoxToEnterName));
        submit.addKeyListener(new SubmitButton(textBoxToEnterName));
        JPanel panelBottom = new JPanel();
        panelBottom.add(submit);

        //Add panelTop to JFrame
        add(panelTop, BorderLayout.NORTH);
        add(panelBottom, BorderLayout.SOUTH);

        //JFrame set-up
        setTitle("Name Prompt Program");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        pack();
        setLocationRelativeTo(null);


    }



    public static void main(String[] args) {
        NamePrompt promptForName = new NamePrompt();
        promptForName.setVisible(true); 
    }


}

Et voici la classe actionListener, keyListener:

import Java.awt.Component;
import Java.awt.event.ActionEvent;
import Java.awt.event.ActionListener;
import Java.awt.event.KeyEvent;
import Java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;


public class SubmitButton implements ActionListener, KeyListener {

    JTextField nameInput;


    public SubmitButton(JTextField textfield){
        nameInput = textfield;
    }

    @Override
    public void actionPerformed(ActionEvent submitClicked) {

        Component frame = new JFrame();
        JOptionPane.showMessageDialog(frame , "You've Submitted the name " + nameInput.getText());
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_ENTER){
            System.out.println("Hello");
        }
        Component frame = new JFrame();
        JOptionPane.showMessageDialog(frame , "You've Submitted the name " + nameInput.getText());

    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void keyTyped(KeyEvent arg0) {

    }
}
42
CodyBugstein

Il y a un truc simple pour cela. Après avoir construit le cadre avec tous les boutons, procédez comme suit:

frame.getRootPane().setDefaultButton(submitButton);

Pour chaque image, vous pouvez définir un bouton par défaut qui écoutera automatiquement la touche Entrée (et peut-être un autre événement dont je ne suis pas au courant). Lorsque vous appuyez sur enter dans ce cadre, les ActionListeners leur méthode actionPerformed() sera invoquée.


Et le problème avec votre code, pour autant que je sache, est que votre boîte de dialogue apparaît chaque fois que vous appuyez sur une touche, car vous ne l'avez pas mise dans le corps if. Essayez de le changer en ceci:

@Override
public void keyPressed(KeyEvent e) {
    if (e.getKeyCode()==KeyEvent.VK_ENTER){
        System.out.println("Hello");

        JOptionPane.showMessageDialog(null , "You've Submitted the name " + nameInput.getText());
    }

}

UPDATE: J'ai trouvé ce qui ne va pas avec votre code. Vous ajoutez l'écouteur de clé au bouton Envoyer au lieu de TextField. Changez votre code pour ceci:

SubmitButton listener = new SubmitButton(textBoxToEnterName);
textBoxToEnterName.addActionListener(listener);
submit.addKeyListener(listener);
100
Martijn Courteaux

Connectez-vous avec un panneau d'affichage, cliquez sur le bouton précédant, cliquez sur le nom de la personne, entrez dans le champ de saisie.

SwingUtilities.getRootPane(submitButton).setDefaultButton(submitButton);

Pour accéder à la liste des personnes à contacter, veuillez contacter le service de contrôle de la TVA (Prokcow zoda do prawidłowego kontenera);)

MIS À JOUR

Jest à podstawowy przykład przy użyciu interfejsu API JRootPane#setDefaultButton i klawiszy powiązań

public class DefaultButton {

    public static void main(String[] args) {
        new DefaultButton();
    }

    public DefaultButton() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });
    }

    public class TestPane extends JPanel {

        private JButton button;
        private JLabel label;
        private int count;

        public TestPane() {

            label = new JLabel("Press the button");
            button = new JButton("Press me");

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridy = 0;
            add(label, gbc);
            gbc.gridy++;
            add(button, gbc);
            gbc.gridy++;
            add(new JButton("No Action Here"), gbc);

            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    doButtonPressed(e);
                }

            });

            InputMap im = button.getInputMap(WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
            ActionMap am = button.getActionMap();

            im.put(KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0), "spaced");
            am.put("spaced", new AbstractAction() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    doButtonPressed(e);
                }

            });

        }

        @Override
        public void addNotify() {
            super.addNotify();
            SwingUtilities.getRootPane(button).setDefaultButton(button);
        }

        protected void doButtonPressed(ActionEvent evt) {
            count++;
            label.setText("Pressed " + count + " times");
        }

    }

}

À partir de ce moment, cliquez ici pour voir plus de résultats pour le momentspacelubenterKlawiatura

12
MadProgrammer

Dans la classe ActionListener, vous pouvez simplement ajouter

public void actionPerformed(ActionEvent event) {
    if (event.getSource()==textField){
        textButton.doClick();
    }
    else if (event.getSource()==textButton) {
        //do something
    }
}
2
Ian Lee

Je sais que ce n'est pas la meilleure façon de le faire, mais faites un clic droit sur le bouton en question, les événements, la clé, la clé tapée. C'est un moyen simple de le faire, mais réagit à n'importe quelle touche

0
Dev Singh

Sans cadre, cela fonctionne pour moi:

JTextField tf = new JTextField(20);
tf.addKeyListener(new KeyAdapter() {

  public void keyPressed(KeyEvent e) {
    if (e.getKeyCode()==KeyEvent.VK_ENTER){
       SwingUtilities.getWindowAncestor(e.getComponent()).dispose();
    }
  }
});
String[] options = {"Ok", "Cancel"};
int result = JOptionPane.showOptionDialog(
    null, tf, "Enter your message", 
    JOptionPane.OK_CANCEL_OPTION,
    JOptionPane.QUESTION_MESSAGE,
    null,
    options,0);

message = tf.getText();
0
Brian
 switch(KEYEVENT.getKeyCode()){
      case KeyEvent.VK_ENTER:
           // I was trying to use case 13 from the ascii table.
           //Krewn Generated method stub... 
           break;
 }
0
kpie