2013-06-09 9 views
7

In un'interfaccia utente di mio, ho un PasswordField in questo modo (urm l'uno nella parte inferiore!):Come smascherare un JavaFX PasswordField o mascherare correttamente un campo di testo?

Login dialog with JavaFX PasswordField

Voglio un utente sia in grado di controllare la casella di controllo che si vede nel immagine e hanno tutti i caratteri della password "segreta" visualizzati. Non molto diverso dall'opzione che otteniamo da molte moderne interfacce utente che richiedono una password: stanno fluttuando. Tuttavia, non riesco a trovare nulla nell'API JavaFX che mi consenta di farlo?

Se le mie preoccupazioni valgono, quindi vorrei usare un TextField che visualizzare l'ultimo premuto per solo mezzo secondo o fino a quando non viene premuto prossima chiave chiave, e poi si mascherare tutti gli input dell'utente precedente. Ciò produrrebbe un effetto di animazione che si può vedere a volte nell'interfaccia utente moderna: s. Tuttavia, c'è un modo per entrare in possesso del SO dipendente (penso che sia dipendente dal sistema operativo ??) carattere di eco password che dovrei usare?

Se non è possibile ottenere quel carattere dipendente dal sistema operativo, sarei felice di utilizzare il carattere che vedi nell'immagine (JavaFX su un computer Windows 8). Qual è il punto di codice UTF-8 per questo estraneo?

risposta

23

> Tuttavia, non riesco a trovare nulla nell'API JavaFX che consenta di farlo?

Il componente PasswordField non visualizza il testo mascherato per impostazione predefinita. Tuttavia è possibile utilizzare PasswordField con TextField e attivare o disattivare il testo mascherato/non mascherato utilizzando questi componenti. Dove il testo non mascherato è mostrato da TextField, come nella demo di esempio qui sotto.

> desidero utilizzare un TextField che visualizzare l'ultimo premuto per solo mezzo secondo o fino alla pressione prossima chiave chiave, e quindi egli sarà mascherare tutti gli input dell'utente precedente.

Dal PasswordField, è una versione estesa di TextField. Puoi sempre creare la tua casella di testo personalizzata password con le proprietà che hai citato.

> c'è un modo per me di entrare in possesso del sistema operativo dipendente (penso che dipende dal sistema operativo ??) password di carattere eco dovrei usare?

Francamente non ha afferrato quello che stai dicendo qui. È possibile tenere traccia delle modifiche apportate al testo aggiungendo listener di modifiche a PasswordField.textPrperty() e animazioni, timer, ecc. È possibile ignorare la maschera di richiamo predefinita estendendo PasswordFieldSkin e utilizzandola attraverso il CSS -fx-skin.Vedere la definizione di proiettile nella sua 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(); 
    } 
} 

Infine, Ecco dare il via demo app di mostrare caratteri della password utilizzando le associazioni:

@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

appena provato il culo calci demo. Funziona perfettamente. Potresti non modificare e aggiornare la tua risposta con alcuni commenti sulle domande che ho posto? Se è così posso controllare la tua risposta come risposta accettata. Grazie per la tua demo !! –

+0

@MartinAndersson. Sicuro. Sfortunatamente sono fuori ufficio da pochi giorni. Aggiornerò la mia risposta con i commenti e i link di riferimento APPENA POSSIBILE. –

+0

@MartinAndersson. Si prega di consultare l'aggiornamento. –

1

crea tre elementi nella stessa posizione di un TextField, un PasswodField e un CheckBox per controllare la visibilità a cui si aggiunge l'onAction evento:

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

Nota: Sostituisce il valore di X e Y.

Aggiungi nel controller:

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

Se volete conoscere il valore della password è possibile creare un metodo che restituisce:

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