Как разоблачить JavaFX PasswordField или правильно замаскировать текстовое поле?

в UI мои, у меня есть PasswordField как так (УРМ на дне!):

Login dialog with JavaFX PasswordField

Я хочу, чтобы пользователь мог установить флажок, который вы видите на картинке, и отобразить все символы" секретного " пароля. Не сильно отличается от опции, которую мы получаем от многих современных пользовательских интерфейсов с запросом пароля. однако я не могу найти ничего в API JavaFX, что позволило бы мне это сделать?

Если мой беспокойство верно, тогда я хотел бы использовать TextField, который отображает последнюю клавишу, нажатую только на полсекунды или пока не нажата следующая клавиша,а затем он должен замаскировать все предыдущие вводимые пользователем. Это произведет классный анимационный эффект, который иногда можно увидеть в современных UI:s. Однако,есть ли способ для меня получить зависимую от ОС (я думаю, что это зависит от ОС??) пароль echo символ я должен использовать?

Если невозможно получить эту ОС зависимый символ, тогда я был бы рад использовать символ, который вы видите на картинке (JavaFX на машине Windows 8). Что такое кодовая точка UTF-8 для этого незнакомца?

3 ответов


> однако я не могу найти ничего в API JavaFX, что позволило бы мне это сделать?

на PasswordField компонент по умолчанию не отображает замаскированный текст. Однако вы можете использовать PasswordField С TextField и переключить маскированный / разоблаченный текст, используя эти компоненты соответственно. Где разоблаченный текст отображается TextField, как в примере демо ниже.

> я хотел бы использовать текстовое поле, которое отображает Последний ключ нажимается только полсекунды или пока не нажата следующая клавиша, а затем он должен замаскировать весь предыдущий ввод пользователя.

С PasswordField, сам является расширенной версией TextField. Вы всегда можете создать свое собственное текстовое поле пароля со свойствами, которые вы упомянули.

> есть ли способ для меня получить зависимую от ОС (я думаю, что это зависит от ОС??) пароль echo символ я должен использовать?

откровенно не хватай то, что говоришь. Вы можете отслеживать изменения текста, добавив change listener в PasswordField.textPrperty() и делать анимации, таймеры и т. д. Вы можете переопределить маску пули по умолчанию, расширив PasswordFieldSkin и, используя его через CSS -fx-skin. См. определение bullet в его источник:

public class PasswordFieldSkin extends TextFieldSkin {
    public static final char BULLET = '\u2022';

    public PasswordFieldSkin(PasswordField passwordField) {
        super(passwordField, new PasswordFieldBehavior(passwordField));
    }

    @Override protected String maskText(String txt) {
        TextField textField = getSkinnable();

        int n = textField.getLength();
        StringBuilder passwordBuilder = new StringBuilder(n);
        for (int i=0; i<n; i++) {
            passwordBuilder.append(BULLET);
        }

        return passwordBuilder.toString();
    }
}

наконец, вот начать демо-приложение показа символов пароля с помощью Привязок:

@Override
public void start(Stage primaryStage) {

    // text field to show password as unmasked
    final TextField textField = new TextField();
    // Set initial state
    textField.setManaged(false);
    textField.setVisible(false);

    // Actual password field
    final PasswordField passwordField = new PasswordField();

    CheckBox checkBox = new CheckBox("Show/Hide password");

    // Bind properties. Toggle textField and passwordField
    // visibility and managability properties mutually when checkbox's state is changed.
    // Because we want to display only one component (textField or passwordField)
    // on the scene at a time.
    textField.managedProperty().bind(checkBox.selectedProperty());
    textField.visibleProperty().bind(checkBox.selectedProperty());

    passwordField.managedProperty().bind(checkBox.selectedProperty().not());
    passwordField.visibleProperty().bind(checkBox.selectedProperty().not());

    // Bind the textField and passwordField text values bidirectionally.
    textField.textProperty().bindBidirectional(passwordField.textProperty());

    VBox root = new VBox(10);
    root.getChildren().addAll(passwordField, textField, checkBox);
    Scene scene = new Scene(root, 300, 250);
    primaryStage.setTitle("Demo");
    primaryStage.setScene(scene);
    primaryStage.show();
}

вам нужно создать три элемента:

  • TextField: пароль видимое поле
  • PasswodField: пароль не отображается поле
  • : отображение поля

вы размещаете поля паролей в одной позиции(x, y):

<PasswordField fx:id="pass_hidden" layoutX="X" layoutY="Y" />
<TextField fx:id="pass_text" layoutX="X" layoutY="Y"/>
<CheckBox fx:id="pass_toggle" onAction="#togglevisiblePassword" .... />

Примечание: заменяет значение X и Y.

добавить в контроллер:

@FXML
private TextField pass_text;
@FXML
private CheckBox pass_toggle;
@FXML
private Button btn_start_stop;

/**
 * Controls the visibility of the Password field
 * @param event
 */
@FXML
public void togglevisiblePassword(ActionEvent event) {
    if (pass_toggle.isSelected()) {
        pass_text.setText(pass_hidden.getText());
        pass_text.setVisible(true);
        pass_hidden.setVisible(false);
        return;
    }
    pass_hidden.setText(pass_text.getText());
    pass_hidden.setVisible(true);
    pass_text.setVisible(false);
}

//Run
@Override
public void initialize(URL location, ResourceBundle resources) {
    this.togglevisiblePassword(null);
}

если вы хотите знать значение пароля вы можете создать метод, который возвращает это:

private String passwordValue() {
    return pass_toggle.isSelected()?
       pass_text.getText(): pass_hidden.getText();
}

 void viewpass(ActionEvent event) {




  if (checkpass.isSelected()){
 pass.setPromptText(pass.getText());
 pass.setText(""); 
  pass.setDisable(true);

  }else {
 pass .setText(pass.getPromptText());
 pass.setPromptText("");
 pass.setDisable(false);
 }






}