代码之家  ›  专栏  ›  技术社区  ›  Polar

javafx密码字段将值从项目符号转换为文本字符

  •  0
  • Polar  · 技术社区  · 6 年前

    我只想显示输入值 PasswordField 什么时候 ToggleButton 设置为 TRUE ,的 Bullets 将转换为 Text Character 很简单。我找到了 this 但不幸的是,我有存货,因为 com.sun.javafx.scene.control.behavior.PasswordFieldBehavior 无法解析。

    通常情况下,我们如何或应该如何 密码字段 将能够转换自 项目符号 文本字符 是吗?它有什么作用吗?

    2 回复  |  直到 6 年前
        1
  •  4
  •   Jai    6 年前

    你可以再堆一堆 TextField 并绑定它们的值。

    final StackPane sp = new StackPane();
    final PasswordField pwf = new PasswordField();
    final TextField tf = new TextField();
    final ToggleButton toggle = new ToggleButton();
    
    sp.getChildren().addAll(pwf, tf);
    
    pwf.textProperty().bindBidirectional(tf.textProperty());
    pwf.visibleProperty().bind(toggle.selectedProperty().not());
    tf.visibleProperty().bind(toggle.selectedProperty());
    

    根据两个输入控件的大小调整策略,您可能需要调用 #setManaged(false) 用于文本字段。

        2
  •  0
  •   isnot2bad    6 年前

    你必须通过子类化来编写你自己的皮肤 TextFieldSkin 和压倒性的 maskText(String txt) 返回原始文本而不是项目符号。

    下面是一个可执行的示例:

    package application;
    
    import javafx.application.Application;
    import javafx.beans.property.BooleanProperty;
    import javafx.beans.property.SimpleBooleanProperty;
    import javafx.scene.Scene;
    import javafx.scene.control.PasswordField;
    import javafx.scene.control.ToggleButton;
    import javafx.scene.control.skin.TextFieldSkin;
    import javafx.scene.layout.HBox;
    import javafx.stage.Stage;
    
    public class Main extends Application {
        @Override
        public void start(Stage primaryStage) {
            HBox root = new HBox();
    
            PasswordField passwordField = new PasswordField();
    
            BooleanProperty showPassword = new SimpleBooleanProperty() {
                @Override
                protected void invalidated() {
                    // force maskText to be called
                    String txt = passwordField.getText();
                    passwordField.setText(null);
                    passwordField.setText(txt);
                }
            };
    
            passwordField.setSkin(new TextFieldSkin(passwordField) {
                @Override
                protected String maskText(String txt) {
                    if (showPassword.get()) {
                        return txt;
                    }
                    return super.maskText(txt);
                }
            });
    
            ToggleButton bulletToggle = new ToggleButton("Show Password");
            showPassword.bind(bulletToggle.selectedProperty());
    
            root.getChildren().addAll(passwordField, bulletToggle);
    
            Scene scene = new Scene(root);
    
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }