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

02-10-24 jxb8901
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;
      }
    }
}
<p class="indent">

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

banq
2002-10-24 20:21
对图形方面研究不够,哪位能出手帮忙

xiaofei
2005-01-04 16:48
今天也碰到这个问题,改一下:

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;
    }  
  }

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