我有这个代码示例实现了TextField
的输入掩码:
package com.example;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage stage) {
TextField field = new TextField() {
@Override public void replaceText(int start, int end, String text) {
super.replaceText(start, end, "@");
}
};
Button button = new Button("Show Text");
button.setOnAction(new EventHandler<ActionEvent>(){
@Override
public void handle(ActionEvent event) {
System.out.println("TEXT: " + field.getText());
}
});
VBox root = new VBox(20);
root.setAlignment(Pos.CENTER);
root.getChildren().addAll(field, button);
Scene scene = new Scene(root, 500, 500);
stage.setScene(scene);
stage.show();
}
}
每当我在TextField中输入单词“LIFE”并按下按钮时,输出总是返回TEXT: @@@@
,我希望输出返回TEXT: LIFE
。似乎getText
无效。如何解决这个问题?
答案 0 :(得分:1)
您的方法不起作用,因为replaceText
方法调用setText
;因此,子类中的实现会导致文本字段textProperty
仅包含'@'
个字符。因此,当您致电getText()
时,您会收到一个包含所有'@'
个字符的字符串。
如果你想使用类似TextField
的子类,你必须跟踪&#34;真实的&#34;其他地方的文字,这将变得相当困难。 (另外,我认为你的实现在复制和粘贴时没有正常运行,并且修复它也有点棘手。)
执行此操作的方法可能是使用PasswordField
,并在您要显示文字时将其替换为TextField
。
这是一个简单的例子:
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class RevealPasswordExample extends Application {
@Override
public void start(Stage primaryStage) {
PasswordField passwordField = new PasswordField();
TextField textField = new TextField();
passwordField.textProperty().bindBidirectional(textField.textProperty());
StackPane textContainer = new StackPane(passwordField);
CheckBox showText = new CheckBox("Show text");
showText.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
if (isNowSelected) {
textContainer.getChildren().setAll(textField);
} else {
textContainer.getChildren().setAll(passwordField);
}
});
VBox root = new VBox(5, textContainer, showText);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(24));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
答案 1 :(得分:0)
实际上getText()工作正常,这就是你在输出端得到@@@@的原因。 问题是您使用了replaceText()方法,它将从开头到结尾将文本字段的所有字符替换为“@”。我不知道你为什么使用它。如果您不想显示字段中输入的字符串,请将其作为密码字段,例如
PasswordField field = new PasswordField();
field.getText();
通过使用它也可以获得字段文本,但用户不会看到它。