【发布时间】: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