**
说明:这只是我个人的方法,方法可能不唯一,仅供参考哦,复杂了点(嘻嘻嘻~)。
思路:通过监听,对普通文本框和密码框进行切换来实现。
具体思路:
用一个面板来盛放两个组件(不是两个都放进去),初始化时,将普通文本框加入到面板中。
然后添加对普通文本框实现得到焦点的监听(监听是否失去光标,即是否被选中),监听方法有两个抽象方法,这里只实现得到焦点(光标)的方法,(因为得到光标意味着用户将要输入密码,当然应该切换到密文形式,注意:另外一个方法要写空实现)。
紧接着对密码框进行失去焦点监听(原理同上),注意:这里的切换是有条件的,即当密码框里面的内容为空时,才能进行切换,否则不进行切换。
最后记得将面板加入到相应的容器的对应的位置上面去。
下面我将其封装为一个方法,代码如下:
注释:这里的panel,text_password,field_password的声明放在方法的外面,设为全局变量
publicvoid setField_password(){
text_password =new JTextField("密码");
field_password =newJPasswordField(30);
panel =new JPanel(new BorderLayout());
panel.setBounds(140,225,185,30);
text_password.setPreferredSize(newDimension(185,30));
field_password.setPreferredSize(newDimension(185,30));
field_password.setSize(185,30);
text_password.setSize(185,30);
field_password.setFont(new Font(null,Font.BOLD,25));
text_password.setFont(new Font(null,Font.BOLD,25));
//为输入框设置文本样式
field_password.setFont(font);
text_password.setFont(font);
//为提示文字修改颜色
field_password.setForeground(new Color(126,126,126));
text_password.setForeground(newColor(126,126,126));
//将输入框做成圆角矩形
field_password.setBorder(BorderFactory.createLineBorder(newColor(211,207,208), 1, true));
text_password.setBorder(BorderFactory.createLineBorder(newColor(211,207,208), 1, true));
panel.add(text_password, BorderLayout.SOUTH);
//为文本输入框加入监听功能因为刚开始添加的是文本输入框
text_password.addFocusListener(new FocusListener() {
publicvoid focusGained(FocusEvent e) {//光标进来了
//改变输入框的样式
field_password.setFont(font2);
field_password.setForeground(Color.black);
field_password.setBorder(new LineBorder(newColor(21,131,221)));
//为密码框添加内部类鼠标监听(鼠标经过事件) 当转换为密码框的时候,自动获取到焦点
field_password.addMouseListener(newMouseAdapter(){
publicvoid mouseEntered(MouseEvent e)
{
field_password.requestFocus();
}
});
//移除密码输入框,添加文本输入框,切记面板要重画
panel.remove(text_password);
panel.add(field_password, BorderLayout.SOUTH);
panel.updateUI();
panel.repaint();
}
publicvoid focusLost(FocusEvent arg0) {//光标不在此处 接口必须是实现全部方法
}
});
//为密码框添加监听功能,实现文本框失去焦点时,文本框到密码框的替换
//注意:因为此时输入框已从文本框替换成密码框,不能再对文本框进行监听
field_password.addFocusListener(new FocusListener() {
publicvoid focusLost(FocusEvent e) {//光标不在这里了
//这里的if判断很重要,不能直接写field_password.getText().equals("")来判断密码框为空,
if(new String(field_password.getPassword()).length()== 0){
System.out.println("123");
panel.remove(field_password);
panel.add(text_password, BorderLayout.SOUTH);
panel.updateUI();
panel.repaint();
}
}
publicvoid focusGained(FocusEvent arg0) {//接口必须是实现全部方法
}
});
this.add(panel);
}