Как я могу проверить имя пользователя в поле учебника в Java? - PullRequest
0 голосов
/ 03 августа 2020

Итак, я хотел проверить имя пользователя (длина должна быть от 6 до 30 символов, числа не должны допускаться), которое пользователь ввел до продолжения игры, и я поискал inte rnet и узнал о регулярном выражении выражения. Я не привык к этому, поэтому обнаружил некоторые проблемы. Код должен делать следующее: если пользователь не ввел имя пользователя или если оно содержало символы, запрещенные при нажатии кнопки «начать игру», я хотел, чтобы диалоговое окно появилось и попросило его повторить попытку. И если все было правильно, игра должна продолжаться как обычно, но когда я запускаю этот код, имя пользователя не проверяется, и он входит в игру, несмотря на то, что было введено в текстовое поле, а ниже - то, что у меня есть до сих пор.

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

}

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Эти две строки из кода, который вы разместили в своем вопросе:

String field;
field = textbox_name.getText();

должны быть внутри method actionPerformed(), потому что вы хотите получить содержимое textbox_name после того, как пользователь нажимает на кнопку btnStartGame.

Вот мой переписанный вами код.

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

Кстати, вы должны попробовать использовать верстальщики .

0 голосов
/ 04 августа 2020

Я пробовал использовать ваш 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...