Jdk1.4.1新的焦点控制系统的问题: 1.3下的焦点控制代码在1.4.1下运行出现死循环

banq:
你好!我是一个Java新手经常访问你的网站受益非浅, 有一问题请教:
以下是我在一个项目中的代码片段, 以前在JDK1.3下开发运行没有问题后来升级到1.4后却出现死循环:


public class tt extends JPanel {
private JTextField txtName = new JTextField();
private JButton jButton1 = new JButton();
private JTextField jTextField1 = new JTextField();

public tt() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
txtName.setText("jTextField1");
jButton1.setText("jButton1");
jTextField1.setText("jTextField1");
this.add(txtName, null);
this.add(jButton1, null);
this.add(jTextField1, null);

txtName.setInputVerifier(new SellerVerifier());
}
public static void main(String[] args) {
JFrame window = new JFrame("test");
tt tt1 = new tt();
window.getContentPane().add("Center", tt1);
window.setDefaultCloseOperation(window.EXIT_ON_CLOSE);
window.setSize(300,200);
window.setVisible(true);
}

class SellerVerifier extends InputVerifier {
public boolean verify(JComponent input){
JTextField si = (JTextField)input;
String str = si.getText();
if (str.trim().equalsIgnoreCase("")){
JOptionPane.showMessageDialog(null, "输入不能为空!", "ViTop", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
}
}

经跟踪调试后发现: 当我调用JOptionPane.showMessageDialog时,JoptionPane类内部会设置默认控件并为其请求焦点(即调用requestFocus()函数, 而requestFocus在设置焦点以前会让失去焦点的对象先作输入验证。在1.4.1的焦点系统中就是调用上面代码中的txtName的验证代码, 也就出现了死循环。 而在1.3的焦点系统中则不会! 这算不算是JDK的一个Bug呢?
不知banq有没有好的解决法?

对图形方面研究不够,哪位能出手帮忙

今天也碰到这个问题,改一下:


class SellerVerifier extends InputVerifier {

private boolean tempFocusLost = false;

public boolean verify(JComponent input){

if(tempFocusLost){//for jdk1.4
tempFocusLost = false;
return true;
}

JTextField si = (JTextField)input;
String str = si.getText();
if (str.trim().equalsIgnoreCase(
"")){

tempFocusLost = true;

JOptionPane.showMessageDialog(null,
"输入不能为空!", "ViTop", JOptionPane.ERROR_MESSAGE);
return false;
}
return true;
}
}

我在java5下编译运行过了,java5已经修正了这个bug。
倒是xiaofei给出的方案在java5下会有一点小小的问题。