利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框

转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/53214820

1.背景

JavaFx提供了密码框的专用控件PasswordField,但是最近碰到了“兼容性”问题,密码框控件在本机运行正常,但是在把它换到其他机器上运行起来后,各种问题就出现了:

  • 黑色圆点变为了空心的方框。
  • 密码框中内容不显示

因此,就萌生了用TextField替代PasswordField的想法,不过实现出来的效果是比较密码框时会明文显示密码,这一点暂时还没有找到可行方法,本文仅供大家参考。

密码框编辑状态:
利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框_第1张图片

焦点移除状态:
利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框_第2张图片

2.实现

首先,创建密码框替代对象,提供两个功能:

  • 1、记录真实密码;
  • 2、创建TextField控件。
import com.amap.axf.client.event.TextFieldFocusListener;
import com.amap.axf.client.event.TextFieldTextListener;
import javafx.scene.control.TextField;

/**
 * Created by loongshawn on 2016/11/16.
 *
 * NOTE 为了避免密码框显示异常,通过textfield代替
 */
public class MyStyleTextFieldOfPassWord {

    private String password;
    private String echo;

    public void setPassword(String password){
        this.password = password;
    }

    public String getPassword(){
        return password;
    }

    public void setEcho(String echo){
        this.echo = echo;
    }

    public String getEcho(){
        return echo;
    }


    public TextField getPasswordField(){

        TextField textField = new TextField();

        textField.focusedProperty().addListener(new TextFieldFocusListener(textField,this));
        textField.textProperty().addListener(new TextFieldTextListener(textField,this));
        //textField.hoverProperty().addListener(new TextFieldHoverListener(textField,this));

        return textField;
    }
}

接下来,需要对TextField控件进行监听,设置两种监听:

  • 1、焦点监听
  • 2、文本监听

其中“焦点监听”旨在TextField获得焦点时(编辑状态时)显示真实密码或者失去焦点时显示替代符号。

import com.amap.axf.client.control.MyStyleTextFieldOfPassWord;
import com.amap.axf.client.util.StringUtil;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TextField;

/**
 * Created by loongshawn on 2016/11/17.
 *
 * NOTE 密码框监听
 */
public class TextFieldFocusListener implements ChangeListener<Boolean> {

    private TextField textField;
    private MyStyleTextFieldOfPassWord myStyleTextFieldOfPassWord;

    public TextFieldFocusListener(TextField textField,MyStyleTextFieldOfPassWord myStyleTextFieldOfPassWord){
        this.textField = textField;
        this.myStyleTextFieldOfPassWord = myStyleTextFieldOfPassWord;
    }

    public void changed(ObservableValue observable, Boolean oldValue, Boolean newValue) {

        if (newValue){
            String password = myStyleTextFieldOfPassWord.getPassword();
            if (password != null) {
                textField.setText(password);
            }
        } else {
            String echo = StringUtil.getEcho(myStyleTextFieldOfPassWord.getPassword());
            myStyleTextFieldOfPassWord.setEcho(echo);
            textField.setText(echo);
        }

    }
}

其中“文本监听”旨在TextField获得焦点时(编辑状态时),用户增删该密码时,自动更新MyStyleTextFieldOfPassWord密码框对象的password字段(密码),此密码为明码字符串。

import com.amap.axf.client.control.MyStyleTextFieldOfPassWord;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TextField;

/**
 * Created by loongshawn on 2016/11/17.
 */
public class TextFieldTextListener implements ChangeListener<String> {

    private TextField textField;
    private MyStyleTextFieldOfPassWord myStyleTextFieldOfPassWord;

    public TextFieldTextListener(TextField textField,MyStyleTextFieldOfPassWord myStyleTextFieldOfPassWord){
        this.textField = textField;
        this.myStyleTextFieldOfPassWord = myStyleTextFieldOfPassWord;
    }

    public void changed(ObservableValue observable, String oldValue, String newValue) {
        if (!textField.getText().equals(myStyleTextFieldOfPassWord.getEcho())){
            myStyleTextFieldOfPassWord.setPassword(newValue);
        }
    }
}

最后,整套方法中还用到了一个字符串转换的方法,将密码转为替代符号”*”。

public static String getEcho(String password){

        String echo = "";

        if (password != null && !password.equals("")){

            int length = password.length();
            StringBuffer stringBuffer = new StringBuffer();
            for (int i=0;ireturn echo;
    }

3.补充说明

本文实现的密码框效果

  • 密码框中输入字符后,密码框失去焦点时,字符变为“*”。
  • 鼠标点击密码框时,密码明文会出现。

若使用过程中,碰到其他问题,欢迎留言讨论,希望能够帮助到你。

相关文章:

  • 《 利用JavaFx开发RIA桌面应用-TableView操作》
  • 《 利用JavaFx开发RIA桌面应用-Clipboard剪贴板操作》
  • 《利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框》
  • 《利用JavaFx开发RIA桌面应用-半透明界面设计》
  • 《利用JavaFx开发RIA桌面应用-加载等待界面设计》
  • 《利用JavaFx开发RIA桌面应用-文件拖拽》
  • 《利用JavaFx开发RIA桌面应用-改变stage的标题栏的图标》
  • 《利用JavaFx开发RIA桌面应用-事件监听》
  • 《利用JavaFx开发RIA桌面应用-ComboBox组合编辑框水平增长》
  • 《利用JavaFx开发RIA桌面应用-布局说明》
  • 《利用JavaFx开发RIA桌面应用-在线资料》

你可能感兴趣的:(JAVA,JavaFX)