为什么JavaFX TextField侦听器重复3次?

时间:2018-11-19 14:02:50

标签: javafx listener textfield keypress

我正在尝试跟踪对TextField的输入,并允许用户每个TextField仅输入1个符号,这是我的代码:

package sample;

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        TextField textField = new TextField(); //creating new textfield
        Pane window = new Pane();
        Parent root = window;
        window.getChildren().addAll(textField); //adding textfield to the window
        primaryStage.setScene(new Scene(root, 200, 50));
        primaryStage.show();
        textField.textProperty().addListener(event ->
             {
                 try {
                     if (textField.getLength() > 1) { //check if the length of the textfield text exceeds 1
                         System.out.println("NOT Accepted");
                         textField.setText(String.valueOf(textField.getText().charAt(0))); //set textfield text to first char only
                     } else {
                         System.out.println("Accepted");
                     }
                 } catch (IndexOutOfBoundsException Bound) {}
             }
             );
        }

    public static void main(String[] args) {
        launch(args);
    }
}

当我第一次按下任何符号时,一切正常,但是当我第二次按下时,事件监听器重复3次。例如: 按下“ a”键,控制台输出:

Accepted  //<---Correct
再次按下

“ a”键(或任何其他键),控制台输出:

NOT Accepted  //<---Correct
Accepted      //<---Not correct
Accepted      //<---Not correct

如上所示,侦听器重复3次。 但是我希望控制台只能显示“不接受”,并且不应重复2次以上。

1 个答案:

答案 0 :(得分:3)

我建议使用简单的ChangeListener而不是使用TextFormatter。这样,您可以在不触发其他事件的情况下阻止更改。

    textField.setTextFormatter(new TextFormatter<String>((TextFormatter.Change change) -> {
        String newText = change.getControlNewText();
        if (newText.length() == 1) {
            System.out.println("Accepted");
        } else if (newText.length() > 1) {
            System.out.println("NOT Accepted");
            return null;
        }

        return change;
    }));