【问题标题】:How can I validate the username in a textbook field in Java?如何验证 Java 教科书字段中的用户名?
【发布时间】:2020-08-03 17:59:17
【问题描述】:

所以我想验证用户在游戏继续之前输入的用户名(长度应在 6 到 30 个字符之间,并且不应允许数字),我在互联网上搜索并发现了正则表达式。我不习惯,所以我发现了一些问题。代码应该执行以下操作:如果用户没有输入用户名,或者当他单击“开始游戏”按钮时包含不允许的字符,我希望弹出一个对话框并告诉他再试一次。如果一切正常,游戏应该会正常进行,但是当我运行此代码时,不会检查用户名,尽管在文本框中输入了内容,但它会进入游戏,以下是我目前所拥有的。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.util.regex.*;

public class StartScreen extends JFrame {

private JPanel contentPane;
private JTextField textbox_name;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                StartScreen frame = new StartScreen();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */

public static boolean isValidUsername(String name) 
{ 
    String regex = "^[a-zA-Z]{5,29}$";  //Removed ^[aA-zZ]\\\\w{5,29}$
    Pattern p = Pattern.compile(regex);     
    if (name == null) { 
        return false; 
    }   
    Matcher m = p.matcher(name);    
    return m.matches(); 
 } 

public StartScreen() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 455, 191);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    
    JLabel lblEnterName = new JLabel("Enter Name:");
    lblEnterName.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
    lblEnterName.setBounds(91, 48, 102, 29);
    contentPane.add(lblEnterName);
    
    textbox_name = new JTextField();
    textbox_name.setBounds(205, 49, 130, 28);
    contentPane.add(textbox_name);
    textbox_name.setColumns(10);
    
    String field;
    field = textbox_name.getText();
    
    JButton btnStartGame = new JButton("Start Game");
    btnStartGame.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            
            if(isValidUsername(field)) {
                MainScreen window = new MainScreen();
                window.setVisible(true);
                dispose();
            }
            else {
                JOptionPane.showMessageDialog(null, "Please enter your username correctly");
            }
        }
    });
    
    
    
    btnStartGame.setBounds(150, 102, 117, 29);
    contentPane.add(btnStartGame);
}

}

【问题讨论】:

  • 请查看this regex。除了仅由字母组成并且具有最小和最大长度之外,我是否缺少用户名的一些要求?
  • 这正是应该做的,但是当我运行代码时,我可以输入我喜欢的任何用户名,它直接进入游戏,而不是显示一个对话框。
  • 请检查您的 if 语句。我认为你有它倒退。只有当 btnStartGame.isEnabled() 为真并且名称检查返回真时,它才会抛出错误。我认为你的意思是让它在错误时抛出错误,对吗?
  • 这是有道理的,所以我做了以下事情: if(btnStartGame.isEnabled() && (isValidUsername(field) == false)) 但是,当我这样做时,它一直显示错误,尽管我写在文本框中。
  • 你可能想重新设计你的逻辑。您想要对其进行结构化,以便您正在寻找游戏可以开始的条件并为其他所有内容抛出错误。所以你的if 大括号应该保持游戏开始并执行它们的条件。你的else 应该包含在启动条件不正确时引发错误的代码。

标签: java regex validation


【解决方案1】:

您在问题中发布的代码中的这两行:

String field;
field = textbox_name.getText();

需要inside方法actionPerformed(),因为您想在用户点击按钮btnStartGame之后获取textbox_name的内容。

这是我对您发布的代码的重写。

import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import java.awt.Font;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.ActionEvent;
import java.util.regex.*;

public class StartScreen extends JFrame {

private JPanel contentPane;
private JTextField textbox_name;

/**
 * Launch the application.
 */
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        public void run() {
            try {
                StartScreen frame = new StartScreen();
                frame.setVisible(true);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

/**
 * Create the frame.
 */

public static boolean isValidUsername(String name) 
{ 
    String regex = "^[a-zA-Z]{5,29}$";  //Removed ^[aA-zZ]\\\\w{5,29}$
    Pattern p = Pattern.compile(regex);     
    if (name == null) { 
        return false; 
    }   
    Matcher m = p.matcher(name);    
    return m.matches(); 
 } 

public StartScreen() {
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setBounds(100, 100, 455, 191);
    contentPane = new JPanel();
    contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    setContentPane(contentPane);
    contentPane.setLayout(null);
    
    JLabel lblEnterName = new JLabel("Enter Name:");
    lblEnterName.setFont(new Font("Lucida Grande", Font.PLAIN, 15));
    lblEnterName.setBounds(91, 48, 102, 29);
    contentPane.add(lblEnterName);
    
    textbox_name = new JTextField();
    textbox_name.setBounds(205, 49, 130, 28);
    contentPane.add(textbox_name);
    textbox_name.setColumns(10);
    
    JButton btnStartGame = new JButton("Start Game");
    btnStartGame.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            String field;  // added this line
            field = textbox_name.getText();  // added this line
            
            if(isValidUsername(field)) {
                MainScreen window = new MainScreen();
                window.setVisible(true);
                dispose();
            }
            else {
                JOptionPane.showMessageDialog(null, "Please enter your username correctly");
            }
        }
    });
    
    btnStartGame.setBounds(150, 102, 117, 29);
    contentPane.add(btnStartGame);
}

顺便说一句,你应该尝试使用layout managers

【讨论】:

    【解决方案2】:

    我尝试将您的 isValidUsername 作为独立方法,但没有给出有效结果。即使对于有效名称,它也是错误的。我将其更改为以下内容,并且效果很好:

    public static boolean isValidUsername(String name) 
    { 
        String regex = "^[a-zA-Z]{5,29}$";  //Removed ^[aA-zZ]\\\\w{5,29}$
        Pattern p = Pattern.compile(regex);     
        if (name == null) { 
            return false; 
        }   
        Matcher m = p.matcher(name);    
        return m.matches(); 
     } 
    

    此外,由于代码是在按钮 btnStartGame 被单击后执行的,因此按钮不可能被禁用(禁用的按钮不会触发事件)。出于这个原因,我认为检查 if(btnStartGame.isEnabled()) 是多余的(我可能错了)。因此,您可以检查:

    if(sValidUsername(field)){
      //start game here
    } else {
      //display prompt here
    }
    

    【讨论】:

    • 刚刚尝试过,你是对的,将按钮设置为 isEnabled 毫无用处,但是当我尝试在我的程序中进行更改时,我仍然遇到同样的错误,那就是没有不管写什么,都会弹出对话框。可能错误出在 isValidUsername 方法中,但我就是不知道出了什么问题。
    • @Joao,isValidUsername() 方法工作正常。您可以单独尝试它。您发布的代码不反映工作场景。因为您发布了不在方法内部但同时与 isValidUsername 处于同一级别的代码。您能否分享包含您发布的代码的完整课程?
    • 好的,我会和全班一起编辑答案,让你看看。
    猜你喜欢
    • 2016-03-05
    • 2012-09-09
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多