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