2013-06-09 12 views
7

W interfejsie kopalni, mam PasswordField jak tak (URM jeden na dole!):Jak zdemaskować element JavaFX PasswordField lub poprawnie zamaskować pole tekstowe?

Login dialog with JavaFX PasswordField

chcę użytkownika, aby być w stanie sprawdzić pole widać w i wyświetlaj wszystkie "tajne" znaki hasła. Nie różni się wiele od opcji, którą otrzymujemy z wielu nowoczesnych interfejsów z pytaniem o hasło: pływających w pobliżu. Jednak nie mogę znaleźć niczego w API JavaFX, które pozwoliłoby mi to zrobić?

Jeśli moje obawy są prawdziwe, chciałbym użyć TextField, który wyświetla ostatni klawisz wciśnięty tylko na pół sekundy lub do momentu naciśnięcia następnego klawisza, a następnie zamaskuje wszystkie poprzednie dane wprowadzone przez użytkownika. W ten sposób powstaje fajny efekt animacji, który można czasami zaobserwować w nowoczesnym interfejsie użytkownika: s. Jednakże, jest sposób dla mnie, aby uzyskać zależny od systemu operacyjnego (myślę, że jest zależny od systemu operacyjnego?) hasło echo charakter powinienem użyć?

Jeśli nie można uzyskać tej zależnej od systemu operacyjnego postaci, to chętnie skorzystam z postaci widocznej na obrazku (JavaFX na komputerze z Windows 8). Jaki jest punkt kodowy UTF-8 dla tego nieznajomego?

Odpowiedz

23

> Jednak nie mogę znaleźć niczego w API JavaFX, które pozwoli mi to zrobić?

Komponent PasswordField nie wyświetla domyślnie zamaskowanego tekstu. Jednak można użyć PasswordField z TextField i przełączać zamaskowany/niezamaskowany tekst, używając odpowiednio tych składników. Gdzie niezamaskowany tekst jest pokazywany przez TextField, jak w przykładzie poniżej.

> Chciałbym użyć TextField że wyświetlenie ostatnio wciśnięty klawisz dla tylko pół sekundy lub do następnego naciśnięcia klawisza, a następnie jest on maskować wszystkie poprzednie dane wprowadzone przez użytkownika.

Od PasswordField sam w sobie jest rozszerzoną wersją TextField. Zawsze możesz zbudować własne pole tekstowe z własnymi właściwościami.

> jest jakiś sposób dla mnie zdobyć OS zależnej (myślę, że to jest OS zależne ??) hasło echo znaków należy użyć?

Szczerze mówiąc, nie złapałem tego, co tu mówisz. Możesz śledzić zmiany tekstu, dodając detektor zmian do PasswordField.textPrperty() i robić animacje, zegary itp. Możesz zastąpić domyślną maskę wypunktowania, rozszerzając PasswordFieldSkin i używając jej poprzez CSS -fx-skin.Patrz definicja kulą w swojej source here:

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(); 
    } 
} 

Wreszcie Oto inauguracją aplikację demonstracyjną pokazując znaki hasła za pomocą wiązań:

@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(); 
} 
+0

prostu starał dupę kopać demo. Działa bezbłędnie. Czy nie możesz edytować i aktualizować odpowiedzi, dodając komentarze na temat zadanych pytań? Jeśli tak, mogę sprawdzić twoją odpowiedź jako zaakceptowaną odpowiedź. Wiele razy dla twojego demo !! –

+0

@MartinAndersson. Pewnie. Niestety jestem nieobecny przez kilka dni. Będę aktualizować moją odpowiedź z komentarzami i odnośnikami jak najszybciej. –

+0

@MartinAndersson. Zobacz aktualizację. –

1

tworzy trzy elementy w tej samej pozycji, pole tekstowe, o PasswodField a pole wyboru, aby kontrolować widoczność do którego dodamy onAction zdarzeń:

<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" .... /> 

Uwaga: Zastępuje wartość X i Y.

Dodaj w kontrolerze:

@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); 
} 

Jeśli chcesz poznać wartość hasło można stworzyć metodę, która zwraca go:

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