我有两个编辑框,我想在输入第一个框里的内容不正确的时候,弹出个对话框提示错误信息,然后焦点重新定在第一个框上,目前我写了代码,可是弹出的对话框会弹出两次,请问为什么??其实应该只弹出一次才对。代码如下:
package com.wlh.test;import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;public class TestFoucs { JTextField f1; JTextField f2; JFrame f; JPanel p; JLabel l1; JLabel l2; public TestFoucs() {// try {
// UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
// } catch (Exception ex) {
// System.out.println("Exception: " + ex);
// } f = new JFrame("测试焦点问题");
Container con = f.getContentPane();
p = new JPanel();
l1 = new JLabel("编辑框1:");
l2 = new JLabel("编辑框2:");
f1 = new JTextField("", 12);
f1.setBackground(Color.lightGray);
f1.addFocusListener(new FocusHandler()); f2 = new JTextField("", 12);
//f2.setBackground(Color.lightGray);
//f2.addFocusListener(new FocusHandler());
p.setLayout(new GridLayout(2, 2));
p.add(l1);
p.add(f1); p.add(l2);
p.add(f2);
con.add(p); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
f.pack();
f.setSize(400, 200);
} class FocusHandler implements FocusListener
{
public void focusGained(FocusEvent event)
      {
         JTextField tf = (JTextField)event.getComponent();
         tf.setBackground(Color.pink);
         tf.requestFocus();
         
      }  public void focusLost(FocusEvent event)
      {
         JTextField tf = (JTextField)event.getComponent();
         tf.setBackground(Color.lightGray);
         if(tf.getText().length()<=0)
         {
          tf.requestFocus();
          JOptionPane.showMessageDialog(tf, "不能为空");
         }
      }
}

public static void main(String[] args) {
new TestFoucs();
}
}

解决方案 »

  1.   

    if(tf.getText().length() <=0) 
            { 
            tf.requestFocus(); 
            JOptionPane.showMessageDialog(tf, "不能为空"); 
            } 当f1里的内容为空时,调用上诉,此时f1重新获得焦点
    但JOptionPane.showMessageDialog(tf, "不能为空")后焦点就到了这个MessageDialog上了
    tf又失去了焦点,再次调用上诉方法
    所以又调用了一次JOptionPane.showMessageDialog(tf, "不能为空"); 
    当然有俩个MessageDialog