好吧首先这可能是一个愚蠢的想法,我试图验证一个线程内的名称,所以我可以撤消用户已经做了什么,如果有一个数字这个代码我写在线程的运行方法
if(!jTextField1.getText().isEmpty())
{
for(int s=0;s<jTextField1.getText().length();s++)
{
if(Character.isDigit(jTextField1.getText().charAt(jTextField1.getText().length()-1)))
{
jTextField1.setText(new StringBuilder(jTextField1.getText()).deleteCharAt(jTextField1.getText().length()-1).toString() );
showMessageDialog(null, "you cant add digts for names");
jTextField1.setCaretPosition(jTextField1.getText().length());
}
}
}
但是这有时候会出现一些例外情况,但是
这是我做过的身份证验证。有时候即使我输入一个数字,它也会将其识别为字符并删除该号码..plz帮助..
注意::这个身份证部分有时完美地工作,因为我只想要一段时间它不起作用..这是因为线程
int y=-1;
if(!jTextField4.getText().equals(""))
{
if(jTextField4.getText().endsWith("v"))
{
if(jTextField4.getText().length()<11)
{
jLabel11.setText(Integer.toString(10-jTextField4.getText().length()));
for(int x=0;x<jTextField4.getText().length()-1;x++)//testing if there are any letters in the middle
{
if(!Character.isDigit(jTextField4.getText().charAt(x)))
{
y=x;
}
if(y!=-1)
{
showMessageDialog(null,jTextField4.getText().charAt(x) );
jTextField4.setText(new StringBuilder(jTextField4.getText()).deleteCharAt(y).toString());
jTextField4.setCaretPosition(x);
showMessageDialog(null, "this should be a number");
}
y=-1;
}
}
else
{
jTextField4.setText(new StringBuilder(jTextField4.getText()).deleteCharAt(jTextField4.getText().length()-2).toString());
showMessageDialog(null, "no more than 10 chars");
jTextField4.setCaretPosition(jTextField4.getDocument().getLength()-1);
}
}
else if(!jTextField4.getText().endsWith("v"))
{
showMessageDialog(null, "it should be ended with v");
jTextField4.setText(jTextField4.getText()+"v");
jTextField4.setCaretPosition(jTextField4.getDocument().getLength()-1);
}
}
答案 0 :(得分:0)
由于您在单独的线程中运行它,因此在执行此代码时,jTextField1.getText()的内容可能会更改。例如,用户可能会在获得字符串长度之后但在访问该位置的字符之前删除文本字段中的内容,从而导致索引超出范围异常。
一种解决方案是将字符串从文本字段中删除一次,就在此代码块之前,以便您始终使用相同的字符串,即使字符串在执行代码时可能会过时。但是,您的setCaretPosition()调用仍可能抛出异常。另一种可能性是捕获索引超出范围的异常,将其作为输入字段已被更改的信号,并重新完成整个过程。