我有两个编辑框,我想在输入第一个框里的内容不正确的时候,弹出个对话框提示错误信息,然后焦点重新定在第一个框上,目前我写了代码,可是弹出的对话框会弹出两次,请问为什么??其实应该只弹出一次才对。代码如下:
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.   

    public void focusLost(FocusEvent event)
    {
            JTextField tf = (JTextField)event.getComponent();        if(tf.getText().length() <=0)
            {
                JOptionPane.showMessageDialog(tf, "不能为空");
            }        tf.setBackground(Color.lightGray);
    }
      

  2.   

    public void focusLost(FocusEvent event)
    {
            JTextField tf = (JTextField)event.getComponent();        if(tf.getText().length() <=0)
            {
                JOptionPane.showMessageDialog(tf, "不能为空");
                return;
            }        tf.setBackground(Color.lightGray);
    }
      

  3.   

    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 TestFocus { JTextField f1; JTextField f2; JFrame f; JPanel p; JLabel l1; JLabel l2; public TestFocus() { // 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 TestFocus(); 


    把紅色那句注釋掉 就行了~
      

  4.   

        if(jTxFName.getText().length() <=0)
        {
            JOptionPane.showMessageDialog(null, "不能为空");
            jTxFName.requestFocus();
            return;
        }    jTxFName.setBackground(Color.lightGray); 试过了,没问题
      

  5.   

    horizonlyhw :  你好,首先是感谢。你把那红色的注销掉。是可以提示框只弹出一次了,我也早就用这样的方法实现了,但是我最重要的是想要提示后焦点重新回到第一个编辑框上啊,而不是到了第二个编辑框里。所以你的办法解决不了我的问题啊。
      

  6.   

    channon :你好,你是怎么实现的。我想是有两个编辑框,刚初始化界面的时候光标在第一个编辑框,此时我什么都不输入,然后点第二个编辑框,此时弹出提示框(我只想让它弹出一次来,也应该只弹出一次。但是我没能实现,不知道怎么办),我点确定后,想让光标重新再回到第一个编辑框里。我有把我的代码简化了一下,发上来,看能否修改好后给我,谢谢!!!代码:
    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.BorderFactory;
    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; JTextField tf; public TestFoucs() { f = new JFrame("测试焦点问题");
    Container con = f.getContentPane();
    p = new JPanel();
    l1 = new JLabel("编辑框1:");
    l2 = new JLabel("编辑框2:");
    f1 = new JTextField("", 12);
    f1.addFocusListener(new FocusHandler()); f2 = new JTextField("", 12);
    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) { return; } public void focusLost(FocusEvent event) {
    if (event.getSource() == f1) {
    if ((f1.getText().length() <= 0)) {
    JOptionPane.showMessageDialog(null, "不能为空");
    f1.requestFocus();
    return;
    }
    }
    } } public static void main(String[] args) {
    new TestFoucs();
    }
    }
      

  7.   

    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 TestFocus { JTextField f1; JTextField f2; JFrame f; JPanel p; JLabel l1; JLabel l2; public TestFocus() { 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(focusListener); f2 = new JTextField("", 12); 
     
    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); 
    } FocusListener focusListener = new FocusListener(){ public void focusGained(FocusEvent e) {
    if (e.getSource() == f1){
    f1.setBackground(Color.pink); 
            //f1.requestFocus(); 

    }

    } public void focusLost(FocusEvent e) {
    if (e.getSource() == f1){
    f1.removeFocusListener(focusListener);
    f1.setBackground(Color.lightGray); 
            if(f1.getText().trim().length() <=0) 
            { 
             f1.requestFocus();
            JOptionPane.showMessageDialog(f1, "不能為空"); 
            System.out.println("2");
            
            f1.addFocusListener(focusListener);
            } 
    }


    }

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

    } 你看改成這樣  怎么樣     大概思路就是  在監聽中去除已有的監聽  然後在失去焦點的時候再加回來