TextField - getText()不起作用

时间:2016-01-25 04:19:40

标签: java javafx javafx-2 javafx-8

我有这个代码示例实现了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无效。如何解决这个问题?

2 个答案:

答案 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();

通过使用它也可以获得字段文本,但用户不会看到它。