teclado keypressed docs java swing keylistener

docs - keypressed java enter



Permitir que la tecla "Enter" presione el botón de enviar, en lugar de solo usar MouseClick (7)

En la clase ActionListener, simplemente puede agregar

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

Estoy aprendiendo la clase Swing ahora y todo al respecto. Tengo este programa de juguetes que he estado preparando que solicita un nombre y luego presenta un JOptionPane con el mensaje "Has ingresado (Tu nombre)". Solo se puede hacer clic en el botón de enviar que uso, pero me gustaría que funcione con el botón Enter también. Intenté agregar un KeyListener, como se recomienda en el libro de Java que estoy usando (Eventful Java, Bruce Danyluk y Murtagh).

Este es mi código:

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

Y esta es la clase 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) { } }


Hay un truco simple para esto. Después de que haya construido el marco con todos los botones, haga lo siguiente:

frame.getRootPane().setDefaultButton(submitButton);

Para cada cuadro, puede establecer un botón predeterminado que escuche automáticamente la tecla Intro (y tal vez algún otro evento del que no tenga conocimiento). Cuando actionPerformed() Intro en ese marco, se actionPerformed() los ActionListeners a su método actionPerformed() .

Y el problema con su código es que su cuadro de diálogo aparece cada vez que presiona una tecla, porque no lo puso en el cuerpo del if. Intenta cambiarlo a esto:

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

ACTUALIZACIÓN: encontré lo que está mal con tu código. Está agregando el oyente clave al botón Enviar en lugar de a TextField. Cambia tu código a esto:

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


La forma más fácil sería hacer ...

textBoxToEnterName.addActionListener(new ActionListener()

... sabes qué hacer desde aquí


Puede utilizar el panel raíz de contenedores de nivel superior para establecer un botón predeterminado, que le permitirá responder a la entrada.

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

Esto, por supuesto, supone que ha agregado el botón a un contenedor válido;)

ACTUALIZADO

Este es un ejemplo básico que utiliza la API JRootPane#setDefaultButton y las teclas de enlace

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"); } } }

Esto, por supuesto, asume que el componente con enfoque no consume el evento clave en cuestión (como el segundo botón que consume el espacio o ingresa las teclas


Sé que esta no es la mejor manera de hacerlo, pero haga clic derecho en el botón en cuestión, eventos, clave, clave mecanografiada. Esta es una manera simple de hacerlo, pero reacciona a cualquier tecla


Sin un marco, esto funciona para mí:

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


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