2012-12-27 55 views
2

我希望用户只输入字母或空格 如果用户输入其他字符,我想给人以JOptionPane的 消息我已经搜查,我想下面的代码的JTextField只接受字母和空格

if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText()))) 
     JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE); 

但现在无论我进入它给人的错误

现在我改变了代码

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

现在它给消息○只有第一次用户输入号码。 我该如何解决这个问题

+1

看到这个答案:http://stackoverflow.com/a/8017847/597657 –

+0

感谢但所有关于数字的例子都有字母表的例子吗?因为我无法理解它如何将字母代码转换为 – mxyz

+0

你也可以使用JFormattedTextField – exexzian

回答

8

使用DocumentFilter,这里是我做了一个例子,它只能接受字母字符和空格:

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

    } 
} 
1

你在第一行的末尾有分号。所以它不是真的测试正确。

像这样的声明(这是你所拥有的):

if (condition) ; 

将执行空语句(;)如果条件为真,然后进入下一行。如果条件不成立,它将转到下一行。这两个操作具有相同的结果。

您可能会尝试在所有“if”语句中使用大括号。有时很繁琐,但很难搞砸。

if (!(Pattern.matches("^[a-zA-Z]+$", answerField1.getText()))) { 
    JOptionPane.showMessageDialog(null, "Please enter a valid character", "Error", JOptionPane.ERROR_MESSAGE); 
} 

这就是我要做的。你可以擦掉分号。

+0

哦,是的。您在正则表达式的方括号中没有空格,因此不允许有空格。这可能是一个复制问题(或不)。 –

+0

没有什么变化。还有另一种方法可以做到吗? – mxyz

+0

1)尝试使用调试器进行单步调试。如果您为文本值和match()调用的结果创建了一些局部变量,则更容易看到发生了什么。 –

相关问题