>但是,我在 JavaFX API 中找不到任何可以让我这样做的东西?
默认情况下,PasswordField
组件不显示蒙版文本。但是,您可以分别使用这些组件来PasswordField
使用TextField
和切换蒙版/未蒙版文本。未屏蔽的文本由 显示TextField
,如下面的示例演示所示。
>我想使用一个 TextField 来显示最后按下的键仅半秒或直到按下下一个键,然后他将屏蔽所有以前的用户输入。
因为PasswordField
, 本身就是TextField
. 您始终可以使用您提到的属性构建自己的自定义密码文本框。
>有没有办法让我掌握操作系统相关的(我认为它是操作系统相关的??)我应该使用的密码回显字符?
坦率地说,没有抓住你在这里说的话。您可以通过添加更改侦听器并执行动画、计时器等来跟踪文本更改。您可以通过扩展和使用 CSSPasswordField.textPrperty()
来覆盖默认的项目符号掩码。请在此处查看其源代码中的子弹定义:PasswordFieldSkin
-fx-skin
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();
}