public class RegisterFrame extends JFrame { JPanel p = null;
JLabel lblUsername = new JLabel(" 用户名 :");
JLabel lblPassWord1 = new JLabel("输入密码:");
JLabel lblPassWord2 = new JLabel("确认密码:");

JLabel nameCheck = new JLabel();
JLabel code1Check = new JLabel();
JLabel code2Check = new JLabel();

JTextField txtUsername = new JTextField(20);
JPasswordField txtPassWord1 = new JPasswordField(20);
JPasswordField txtPassWord2 = new JPasswordField(20);

JButton btnRegister = new JButton("注册");

public RegisterFrame(){

//添加面板背景
p = new JPanel(){ 
public void paintComponent(Graphics g) {
super.paintComponent(g);
//这里插入背景图片
                p.setLayout(null);
     lblUsername.setBounds(20,20,50,20);
     p.add(lblUsername);
     txtUsername.setBounds(80,20,100,20);
     p.add(txtUsername);
     nameCheck.setBounds(200,20,200,20);
     p.add(nameCheck);
     
     lblPassWord1.setBounds(20,40,60,20);
     p.add(lblPassWord1);
     txtPassWord1.setBounds(80,40,100,20);
     p.add(txtPassWord1);
     code1Check.setBounds(200,40,200,20);
     p.add(code1Check);      lblPassWord2.setBounds(20,60,60,20);
     p.add(lblPassWord2);
     txtPassWord2.setBounds(80,60,100,20);
     p.add(txtPassWord2);
     code2Check.setBounds(200,60,200,20);
     p.add(code2Check);      btnRegister.setBounds(60,80,60,20);
     p.add(btnRegister);
}
};

txtUsername.addFocusListener(new NameCheckListener());
txtPassWord1.addFocusListener(new CodeCheckListener());
        txtPassWord2.addFocusListener(new Code2CheckListener());


setTitle("注册平台");
//将窗体设置为当前系统风格
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
javax.swing.SwingUtilities.updateComponentTreeUI(this);
}catch(Exception e){
e.printStackTrace();
}

    setSize(400,150);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(p);
setVisible(true);
} //姓名验证
class NameCheckListener extends FocusAdapter{

@Override
public void focusLost(FocusEvent e) {
String name = txtUsername.getText(); 
if(name.trim().equals("")){
nameCheck.setText("用户名不能为空");
}else{
if(name.equals("aaa")){//已被注册的用户名aaa
nameCheck.setText("用户名已被注册");
}else{
nameCheck.setText("√");
}
}
}
}

    //密码1验证
class CodeCheckListener extends FocusAdapter{ @Override
public void focusLost(FocusEvent e) {
String code = txtPassWord1.getText(); 
if(code.trim().equals("")){
code1Check.setText("密码不能为空");
return;
}else{
code1Check.setText("√");
return;
}
}
}

    //密码2验证
class Code2CheckListener extends FocusAdapter{ @Override
public void focusLost(FocusEvent e) {
String code1 = txtPassWord1.getText(); 
String code2 = txtPassWord2.getText(); 
if(code1.trim().equals("")){
code2Check.setText("请先输入初始密码");
return;
}
if(code2.trim().equals("")){
code2Check.setText("确认密码不能为空");
return;
}else{
if(code2.trim().equals((code1.trim()))){
code2Check.setText("√");
    return;
    }else{
     code2Check.setText("确认密码输入错误");
    return;
    }
    }
}
}

public static void main(String[] args) {
RegisterFrame rf = new RegisterFrame();
}
}
--------------------------------------------
当运行该程序时,输入完用户名将焦点转到密码框时,会执行完一轮所有的文本框,且以后选择焦点时,经常不按选择执行,这到底是什么原因啊!?拜托能详细说一下哪里出错了~

解决方案 »

  1.   

    你不能将Panel构造的代码放到paintComponent中,这样每次重绘的时候都会重新构造一遍。
    应该是这样的://添加面板背景
    p = new JPanel(){  
    public void paintComponent(Graphics g) {
    super.paintComponent(g);
    //这里插入背景图片
    }
    };
    p.setLayout(null);
    lblUsername.setBounds(20,20,50,20);
    p.add(lblUsername);
    txtUsername.setBounds(80,20,100,20);
    p.add(txtUsername);
    nameCheck.setBounds(200,20,200,20);
    p.add(nameCheck);
     
    lblPassWord1.setBounds(20,40,60,20);
    p.add(lblPassWord1);
    txtPassWord1.setBounds(80,40,100,20);
    p.add(txtPassWord1);
    code1Check.setBounds(200,40,200,20);
    p.add(code1Check);lblPassWord2.setBounds(20,60,60,20);
    p.add(lblPassWord2);
    txtPassWord2.setBounds(80,60,100,20);
    p.add(txtPassWord2);
    code2Check.setBounds(200,60,200,20);
    p.add(code2Check);btnRegister.setBounds(60,80,60,20);
    p.add(btnRegister);
      

  2.   

    另外,当你不想离开某个控件的时候,记得在这个控件上停留,如:
    code1Check.requestFocusInWindow(); //不离开密码输入框
      

  3.   

    谢谢啊~那有没有不改变现在按钮等控件放在paintComponent中的解决办法?我放在那里是有原因的,因为在插入背景图片后,根据背景图片的当时大小,对每个控件部位按比例放在其各个部位。然后将整个面板也根据其背景图片变化大小,这样在最大最小后各个按钮等都是相对不变位置的。不能拿出来啊~~~
    拜托给我个解决方法吧!!!
      

  4.   

    class XPanel{
        Image background;
        XPanel(Image image){
            background = image;
            setSize(image.getWidth(null),image.getHeight(null));
            ......
        }
        .....
        @Override public void paintComponent(Graphics g){
            .......
            g.drawImage(image,0,0,null);
            .......
        }
    }
      

  5.   

    拿出来是肯定要的。
    图片加入Panel也要拿出来。
    要知道paintComponent老是被调用。难道你图片总是在变吗?一般也就在创建Panel的时候变一下的吧。
      

  6.   

    额~知道了!谢谢解答!
    我只是想要在拖拉边框时背景也跟着压缩,所以在paintComponent使用:
    g.drawImage(bg1,0,0,this.getWidth(),this.getHeight(),this); 本想在方法外部使用布局管理器布置各组件,但布局管理器不能达到效果,所以就只能把组件按照这种方式lblUsername.setBounds((int)(this.getWidth()*540/951), (int)(this.getHeight()*100/452), (int)(this.getWidth()*55/951), (int)(this.getHeight()*20/452));
    放在paintComponent中,随着边框拖动,不断刷新其在面板中的相对位置,结果很多监听事件都乱套了……随着边框拖动,不断刷新组件在面板中的相对位置<——有什么好方法?现在又纠结这个了~~~
      

  7.   

    输入验证 Swing也提供了。jcomponent.setInputVerifier(new InputVerifier(){
        public boolean verify(JComponent c){
            ...
        }
    });
      

  8.   

    唉,其实这就是LayoutManager要做的事情。
    如果真的没有你喜欢的布局器,那你可以在resize事件中做这种改变大小的事情(而不是在paintComponent事件中),如下 p.addComponentListener(new ComponentAdapter() {
          public void componentResized(ComponentEvent e) {
           int width = ((JPanel)e.getSource()).getWidth();
           lblUsername.setBounds(width/10, 20, 50, 20);
            }
    });
      

  9.   

    亲~我真的是爱shi你了!!!!谢谢~