Javafx 在密码字段中从项目符号到星号

Javafx 在密码字段中从项目符号到星号,javafx,Javafx,是否可以在密码字段中将这些项目符号更改为星号?如果是,怎么做? 不幸的是,项目符号在TextFieldSkin中被硬编码,但是您可以通过覆盖默认值轻松创建密码皮肤,如下所示: import com.sun.javafx.scene.control.skin.TextFieldSkin; import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; public class PasswordSk

是否可以在密码字段中将这些项目符号更改为星号?如果是,怎么做?

不幸的是,项目符号在
TextFieldSkin
中被硬编码,但是您可以通过覆盖默认值轻松创建密码皮肤,如下所示:

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

public class PasswordSkin extends TextFieldSkin {
    public PasswordSkin(TextField textField) {
        super(textField);
    }

    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("*");

            return passwordBuilder.toString();
        } else {
            return txt;
        }
    }
}
或者,您可以在样式表中包含以下内容,而不是手动设置外观:

.password-field {
    -fx-skin: 'sample.PasswordSkin'
}

确保更新了
sample.PasswordSkin
,以反映皮肤的完全限定类名。现在,加载了样式表的每个场景或节点都不需要手动配置外观。

注意,在Java 9中,
TextFieldSkin
的包名更改为
javafx.Scene.control.skin.TextFieldSkin
(并且它成为公共API的一部分)。如果我们在运行时调用此方法(例如在显示密码的情况下),它将调用此异常:
线程“JavaFX应用程序线程”java.lang.NullPointerException中的异常,位于com.sun.JavaFX.scene.control.skin.TextFieldSkin.updateSelection(TextFieldSkin.java:391)在com.sun.javafx.scene.control.skin.TextFieldSkin.updateSelection(TextFieldSkin.java:391)
.password-field {
    -fx-skin: 'sample.PasswordSkin'
}