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有没有好的解决法?