如何确保 JTextField 只包含字母?
Posted
技术标签:
【中文标题】如何确保 JTextField 只包含字母?【英文标题】:How to make sure that JTextField contains only letters? 【发布时间】:2015-07-06 19:29:52 【问题描述】:我只想在我的姓名字段中输入字母。
我已经尝试过使用matches方法,但不幸的是出了点问题,正在抛出异常。
有没有其他检查方法?
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!");
【问题讨论】:
请向我们展示堆栈跟踪 显示uFName
的值。
不要使用异常来控制逻辑,使用if-else
语句
堆栈跟踪为空。 @TheLostMind
它现在可以工作了。 @TheLostMind。看来我正在使用一个旧的摆动输出,其中我在正则表达式中没有+
。生成新的需要一些时间。非常感谢。
【参考方案1】:
使用DocumentFilter
。它将允许您对文本字段执行实时验证
请参阅Implementing a Document Filter 和DocumentFilter Examples 了解更多详情
例如...
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());
【讨论】:
【参考方案2】:你可以试试这个正则表达式
if(!uFName.matches("^[a-zA-Z]+$"))
【讨论】:
matches()
不需要 ^ and $
。默认情况下,它匹配整个字符串。 :)
它现在可以工作了。看来我使用的是旧的摆动输出,其中我在正则表达式中没有+
。生成新的需要一些时间。非常感谢。 @RahulTripathi以上是关于如何确保 JTextField 只包含字母?的主要内容,如果未能解决你的问题,请参考以下文章