我正在尝试使用KeyEvent来限制jTextField中的字符,以使用以下代码将其用作KeyTyped事件的输入:
private void userIDFieldKeyTyped(java.awt.event.KeyEvent evt) {
char c = evt.getKeyChar();
if(c!=KeyEvent.VK_BACK_SPACE && c!=KeyEvent.VK_DELETE){
if (Character.isLetter(c) && Character.isDigit(c)){
} else {
evt.consume();
}
}
}
但是上面的代码没有按预期工作,它没有接受任何字符,因为从我试图仅输入AlphaNumeric字符的代码中可以明显看出,有什么办法可以消除此问题?我也尝试过使用KeyEvent.VK_ALPHANUMERIC
,但是它也不起作用。
编辑: 我限制字符的意思是,文本字段只能输入我允许的某些字符,而不能输入已经输入一定数量的字符后停止输入。
答案 0 :(得分:0)
我认为JFormattedTextField
能满足您的所有要求。它可以限制输入的字符数,并过滤掉不需要的字符。这是一个小例子。 MaskFormatter
负责处理所需的限制。
import java.awt.EventQueue;
import java.text.ParseException;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.WindowConstants;
import javax.swing.text.MaskFormatter;
/**
* For testing class {@code javax.swing.JFormattedTextField}
*/
public class FmTxtFld implements Runnable {
private JFrame frame;
private JFormattedTextField fmtTxtFld;
@Override // java.lang.Runnable
public void run() {
try {
showGui();
}
catch (ParseException xParse) {
xParse.printStackTrace();
}
}
private void showGui() throws ParseException {
frame = new JFrame("FmTxtFld");
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
// Ten alphanumeric characters, i.e. letter or digit.
MaskFormatter formatter = new MaskFormatter("AAAAAAAAAA"); //throws java.text.ParseException
fmtTxtFld = new JFormattedTextField(formatter);
fmtTxtFld.setColumns(10);
JLabel label = new JLabel("JFormattedTextField");
JPanel panel = new JPanel();
panel.add(label);
panel.add(fmtTxtFld);
frame.add(panel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
FmTxtFld instance = new FmTxtFld();
EventQueue.invokeLater(instance);
}
}
如果运行上面的代码,您将看到文本字段仅回显有效字符,即仅字母和数字,并且不接受超过10个字符。