允许“Enter”键按下提交button,而不是只使用MouseClick

我现在正在学习Swing课程以及它的一切。 我有这个玩具程序,我一直在提示一个名字,然后提出一个消息“你input(你的名字)”的JOptionPane。 我使用的提交button只能被点击,但是我也想让它与Enterbutton一起工作。 我尝试添加一个KeyListener,正如我正在使用的Java书(Eventful Java,Bruce Danyluk和Murtagh)中推荐的那样。

NamePrompt在这里输入图像描述

这是我的代码:

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

这是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) { } } 

这是一个简单的技巧。 在用所有button构build框架之后,请执行以下操作:

 frame.getRootPane().setDefaultButton(submitButton); 

对于每一帧,你可以设置一个默认的button,将自动听input键(也许一些其他事件我不知道)。 当你在那个框架中input时,ActionListeners的actionPerformed()方法将被调用。


就我所见,代码的问题在于,每当您按下某个键时,都会popup对话框,因为您没有将它放在if-body中。 尝试将其更改为:

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

更新:我发现你的代码有什么问题。 您将关键侦听器添加到“提交”button而不是TextField。 将您的代码更改为:

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

您可以使用顶级容器根目录窗格来设置默认button,这将允许它响应input。

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

这当然,假设你已经将button添加到有效的容器;)

更新

这是使用JRootPane#setDefaultButton和键绑定API的基本示例

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

这当然假定具有焦点的组件不消耗有问题的键事件(如第二个button消耗空间input键)

在ActionListener类中,您可以简单地添加

 public void actionPerformed(ActionEvent event) { if (event.getSource()==textField){ textButton.doClick(); } else if (event.getSource()==textButton) { //do something } } 
  switch(KEYEVENT.getKeyCode()){ case KeyEvent.VK_ENTER: // I was trying to use case 13 from the ascii table. //Krewn Generated method stub... break; } 

最简单的方法是做…

 textBoxToEnterName.addActionListener(new ActionListener() 

…你知道从这里做什么

没有框架,这对我有用:

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

我知道这不是最好的办法,但右键单击问题的button,事件,按键,键入types。 这是一个简单的方法来做到这一点,但对任何一个键都有反应