如何使用JFormattedTextField只允许字母和数字

时间:2011-11-20 17:41:56

标签: java swing validation jformattedtextfield

我有这段代码而无法获得MaskFormatter权利 maskformatter

MaskFormatter formatter = null;
  try {
    formatter = new MaskFormatter("HHHHHHH");
  } catch (ParseException e) {
    e.printStackTrace();
  }

txtTroll = new JFormattedTextField(formatter);

我需要任何十六进制字符(0-9,a-z或A-Z)和“H”应该为 只给我(0-9,a-z或A-Z),但我错了。

当我输入文字时,只输入大写字母,而且输入很慢 当我点击txtTroll所有字母消失

3 个答案:

答案 0 :(得分:6)

你可以使用我喜欢的另一种解决方案

编写你的Document类并使用insertString

重写它的regex expr方法

示例:

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.text.AttributeSet;
import javax.swing.text.PlainDocument;

/**
*
* @author cpp-qt
*/
public class HexDocument extends PlainDocument {

private String text = "";

@Override
public void insertString(int offset, String txt, AttributeSet a) {
    try {
        text = getText(0, getLength());
        if ((text + txt).matches("[0-9a-fA-F]{0,7}")) {
            super.insertString(offset, txt, a);
        }
     } catch (Exception ex) {
        Logger.getLogger(HexDocument.class.getName()).log(Level.SEVERE, null, ex);
     }

    }
}

然后

将其设置为textField的文档,如this.jTextField1.setDocument(new HexDocument());

我认为这比使用jFormattedTextField

更好

答案 1 :(得分:2)

你的假设存在一些问题,确保你需要什么,如果你需要字母和数字,HEX 你需要什么,

  

“H”应该只给我(0-9,a-z或A-Z),但我错了。

这是错误的假设,“H”应该给你任何十六进制字符(0-9,a-f或A-F)

请参阅javadoc: MaskFormatter

另外,我建议您查看:Implementing a Document Filter

答案 2 :(得分:0)

HHHH将输出为十六进制。使用AAAAAAA