设置修改JavaFx密码框控件PasswordField的回显字符

背景

JavaFx密码框控件,最近碰到了“兼容性”问题,密码框控件在大部分机器运行正常,但是客户还有一部分用的是XP系统,在其电脑上出现了密码框中黑色圆点不显示的问题。

 

过程

解决这个问题的方案就是想办法将黑色圆点修改为其他可显示的字符,我想到了两种方式;

  • 不使用PasswordField,用其他控件(如TextField)来实现密码框的功能
  • 修改PasswordField,看能否修改其回显的字符

这里我是使用的是第二种方案,第一种方式我在网上找到代码,并没有实践,不知是否可行利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框。

通过对PasswordField的方法进行查看,我发现没有直接修改回显字符的方法,所以我看了源代码,最终发现设置回显字符使用的是 TextFieldSkin.java 类,代码如下:

...

/**
 * Text field skin.
 */
public class TextFieldSkin extends TextInputControlSkin {
   
    ...

    // For use with PasswordField
    public static final char BULLET = '\u25cf';/* 这里就是圆点了 */

    /**
     * Create a new TextFieldSkin.
     * @param textField not null
     */
    public TextFieldSkin(final TextField textField) {
        this(textField, (textField instanceof PasswordField)
                                     ? new PasswordFieldBehavior((PasswordField)textField)
                                     : new TextFieldBehavior(textField));
    }

   ...

    /* 通过这里来设置回显 */
    @Override protected String maskText(String txt) {
        if (getSkinnable() instanceof PasswordField) {
            int n = txt.length();
            StringBuilder passwordBuilder = new StringBuilder(n);
            for (int i = 0; i < n; i++) {
                passwordBuilder.append(BULLET);
            }

            return passwordBuilder.toString();
        } else {
            return txt;
        }
    }

   
}

那么接下来的问题就是

  • 如何修改这个回显字符
  • 如何将修改应用到PasswordField中

由于源代码中的回显字符是一个常量,并不允许修改,所以这里只能够自己写一个类,继承 TextFieldSkin.java 类 ,并重写maskText方法,将回显字符换成我们想要的字符即可,代码如下:

package com.rratchet.strategy.control.skin;

import com.sun.javafx.scene.control.behavior.TextFieldBehavior;
import com.sun.javafx.scene.control.skin.TextFieldSkin;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;

/**
 * @author zgb
 * @date 2019/12/5 14:53
 * @description 解决xp“兼容性”问题,密码框中黑色圆点无法显示
 */
public class MyTextFiledSkin extends TextFieldSkin {

    /**
     * 回显字符,可设置成自己想要的字符
     */
    private char BULLET = '\u25cf';


    public MyTextFiledSkin(TextField textField, char bullet) {
        super(textField);
        this.BULLET = bullet;
    }

    public MyTextFiledSkin(TextField textField) {
        super(textField);
    }

    public MyTextFiledSkin(TextField textField, TextFieldBehavior behavior) {
        super(textField, behavior);
    }

    @Override
    protected String maskText(String txt) {
        if (getSkinnable() instanceof PasswordField) {
            int n = txt.length();
            StringBuilder passwordBuilder = new StringBuilder(n);
            for (int i = 0; i < n; i++) {
                passwordBuilder.append(BULLET);
            }

            return passwordBuilder.toString();
        } else {
            return txt;
        }
    }

    public char getBULLET() {
        return BULLET;
    }

    public void setBULLET(char BULLET) {
        this.BULLET = BULLET;
    }
}

第一个问题解决了,接下来就是第二个问题,如何将修改应用到PasswordField中,通过对PasswordField的方法进行查看,我发现可通过setSkin方法将修改应用到PasswordField中,代码如下:

  PasswordField passwordTxt = new PasswordField();
  TextFieldSkin textFieldSkin = new MyTextFiledSkin(passwordTxt,'#');
  passwordTxt.setSkin(textFieldSkin);

完成!效果如下:

你可能感兴趣的:(JavaFx,JavaFx,PasswordField,密码回显)