Java 如何确保JTextField只包含字母?
我只想在我的姓名字段中输入字母 我已经尝试过使用matches方法,但不幸的是出现了一些问题,并且抛出了异常 是否有其他检查方法Java 如何确保JTextField只包含字母?,java,regex,string,swing,jtextfield,Java,Regex,String,Swing,Jtextfield,我只想在我的姓名字段中输入字母 我已经尝试过使用matches方法,但不幸的是出现了一些问题,并且抛出了异常 是否有其他检查方法 import java.awt.BorderLayout; import java.awt.FlowLayout; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.aw
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class CreateAccount extends JFrame implements ActionListener{
JPanel details = new JPanel(new GridBagLayout());
JLabel fName= new JLabel("First Name:");
JTextField firstNameField = new JTextField(10);
JLabel lName= new JLabel("Last Name:");
JTextField lastNameField = new JTextField(10);
JLabel initialDeposit = new JLabel("Initial Deposit: ");
JTextField initialDepositField = new JTextField(10);
String accountTypes[] = {"Savings","Current"};
JComboBox accountTypesComboBox = new JComboBox(accountTypes);
JLabel accountType= new JLabel("Account type: ");
JButton submit = new JButton("SUBMIT");
JButton review = new JButton("REVIEW");
Administrator admin = new Administrator();
User u[] = new User[admin.maxNumberOfUsers];
CreateAccount() {
buildGui();
setSize(400,300);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public void initialiseUserCount() {
admin.numberOfSavingsAccount = 0;
admin.numberOfCurrentAccount = 0;
admin.numberOfUsers=0;
}
public void buildGui() {
setTitle("New Account Form");
//JPanel submitPanel = new JPanel();
//submitPanel.add(submit);
GridBagConstraints c = new GridBagConstraints();
c.insets=new Insets(10,10,10,10);
// Stretch components horizontally (but not vertically)
c.fill = GridBagConstraints.HORIZONTAL;
// Components that are too short or narrow for their space
// Should be pinned to the northwest (upper left) corner
c.anchor = GridBagConstraints.NORTHWEST;
// Give the "last" component as much space as possible
c.weightx = 1.0;
c.gridx=0;
c.gridy=0;
details.add(fName,c);
c.gridx=1;
c.gridy=0;
details.add(firstNameField,c);
c.gridx=0;
c.gridy=1;
details.add(lName,c);
c.gridx=1;
c.gridy=1;
details.add(lastNameField,c);
c.gridx=0;
c.gridy=2;
details.add(initialDeposit,c);
c.gridx=1;
c.gridy=2;
details.add(initialDepositField,c);
c.gridx=0;
c.gridy=3;
details.add(accountType,c);
c.gridx=1;
c.gridy=3;
details.add(accountTypesComboBox,c);
c.gridx=0;
c.gridy=4;
details.add(submit,c);
c.gridx=1;
c.gridy=4;
details.add(review,c);
add(details);
firstNameField.addActionListener(this);
review.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
if(e.getSource()==firstNameField) {
try {
String uFName = firstNameField.getText().toString();
if(!uFName.matches("[A-Za-z]+"))
throw new Exception();
}
catch(Exception e1) {
firstNameField.setText("");
JOptionPane.showMessageDialog(firstNameField,"Please enter a valid name!");
}
}
}
}
使用
文档过滤器
。它将允许您对文本字段执行实时验证
有关详细信息,请参阅和
例如
public class CharFilter extends DocumentFilter {
public void insertString(DocumentFilter.FilterBypass fb, int offset,
String string, AttributeSet attr)
throws BadLocationException {
StringBuffer buffer = new StringBuffer(string);
for (int i = buffer.length() - 1; i >= 0; i--) {
char ch = buffer.charAt(i);
if (!Character.isLetter(ch)) {
buffer.deleteCharAt(i);
}
}
super.insertString(fb, offset, buffer.toString(), attr);
}
public void replace(DocumentFilter.FilterBypass fb,
int offset, int length, String string, AttributeSet attr) throws BadLocationException {
if (length > 0) {
fb.remove(offset, length);
}
insertString(fb, offset, string, attr);
}
}
并使用类似于
JTextField firstNameField = new JTextField(20);
((AbstractDocument)firstNameField.getDocument()).setDocumentFilter(new CharFilter());
您可以尝试使用这个正则表达式
if(!uFName.matches("^[a-zA-Z]+$"))
请向我们显示堆栈跟踪显示
uFName
的值。不要使用异常来控制逻辑,如果else语句堆栈跟踪为空,请使用@现在它开始工作了@最糟糕的是。似乎我使用的是一个旧的swing输出,在regex中没有+
。生成新的需要一些时间。非常感谢。matches()
不需要^和$
。默认情况下,它与整个字符串匹配。:)现在开始工作了。似乎我使用的是一个旧的swing输出,在regex中没有+
。生成新的需要一些时间。非常感谢@拉胡尔特里帕蒂