java - 允许 "Enter"键按下提交按钮,而不是仅使用 MouseClick

标签 java swing keylistener

我现在正在学习 Swing 类(class)以及有关它的一切。我有一个我一直在整理的玩具程序,它会提示输入名称,然后显示一个带有消息“您已输入(您的姓名)”的 JOptionPane。 我使用的提交按钮只能单击,但我也想让它与 Enter 按钮一起使用。我尝试添加一个 KeyListener,正如我正在使用的 Java 书籍(Eventful Java、Bruce Danyluk 和 Murtagh)中所推荐的那样。

NamePrompt enter image description here

这是我的代码:

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) {

    }
}

最佳答案

有一个简单的技巧。在您使用所有按钮构建框架后,请执行以下操作:

frame.getRootPane().setDefaultButton(submitButton);

对于每一帧,您可以设置一个默认按钮,该按钮将自动监听 Enter 键(可能还有其他一些我不知道的事件)。当您在该框架中按 Enter 键时,将调用 ActionListener 的 actionPerformed() 方法。


据我所知,您的代码的问题是每次您按下一个键时都会弹出对话框,因为您没有将它放在 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());
    }

}

更新:我发现您的代码有什么问题。您将关键监听器添加到提交按钮而不是文本字段。将您的代码更改为:

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

关于java - 允许 "Enter"键按下提交按钮,而不是仅使用 MouseClick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731710/

相关文章:

java - 使用 MYSQL 8 通过 JDBC 语句执行 DDL 时出错

java - 第 K 个元素 N*N 和 vector

java - 当选择一个值时,在 JComboBox 中仅显示一个值

java - Hibernate 使用 OneToMany 添加模型

java正则表达式 [A-Z]{6}-[A-Z]{4}-[A-Z]{4}

java - jxTable 初始排序顺序

java - 如何将 JDialog 粘贴到 JFrame 上?

java - JPasswordField 和 KeyListener

java - 对 Keyevents GetKeyText 方法感到困惑

java - 代码无法正确重绘