Reputation: 63
i want user to enter only alphabet or white space if user enters other character , i want give message with jOptionPane i have searched and i tried the below code
if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText())))
JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
but now whatever i enter it gives the error
now i changed the code
Pattern letterPattern = Pattern.compile("^[a-zA-Z]+$");
if (!(letterPattern.matcher(answerField1.getText()).matches()))
{
JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
}
now it gives message only firs time user enters number . how can i solve this
Upvotes: 2
Views: 19460
Reputation: 79
This code might help you :
answerField1.addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) {
char ch = e.getKeyChar();
if(Character.isDigit(ch)){
answerField1.setText("");
JOptionPane.showMessageDialog(null, "Enter Alphabet Only !");
}
}
});
Upvotes: 0
Reputation: 36423
Use a DocumentFilter
, here is an example I made, it will only accept alphabetic characters and white spaces:
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;
public class Test {
public Test() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Test();
}
});
}
private void initComponents() {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTextField jtf = new JTextField();
//add filter to document
((AbstractDocument) jtf.getDocument()).setDocumentFilter(new MyDocumentFilter());
frame.add(jtf);
frame.pack();
frame.setVisible(true);
}
}
class MyDocumentFilter extends DocumentFilter {
@Override
public void replace(FilterBypass fb, int i, int i1, String string, AttributeSet as) throws BadLocationException {
for (int n = string.length(); n > 0; n--) {//an inserted string may be more than a single character i.e a copy and paste of 'aaa123d', also we iterate from the back as super.XX implementation will put last insterted string first and so on thus 'aa123d' would be 'daa', but because we iterate from the back its 'aad' like we want
char c = string.charAt(n - 1);//get a single character of the string
System.out.println(c);
if (Character.isAlphabetic(c) || c == ' ') {//if its an alphabetic character or white space
super.replace(fb, i, i1, String.valueOf(c), as);//allow update to take place for the given character
} else {//it was not an alphabetic character or white space
System.out.println("Not allowed");
}
}
}
@Override
public void remove(FilterBypass fb, int i, int i1) throws BadLocationException {
super.remove(fb, i, i1);
}
@Override
public void insertString(FilterBypass fb, int i, String string, AttributeSet as) throws BadLocationException {
super.insertString(fb, i, string, as);
}
}
Upvotes: 8
Reputation: 12985
You have a semicolon on the end of the first line. So it is not really testing correctly.
A statement like this (which is what you have):
if (condition) ;
will execute the empty statement (;) if the condition is true and then go to the next line. If the condition is false, it will just go to the next line. These two actions have the same result.
You might try using braces on all "if" statements. It is tedious at times but makes it harder to mess up.
if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText()))) {
JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE);
}
That's what I would do. You can just erase the semicolon.
Upvotes: 1