为什么 JavaFX TextField 侦听器重复 3 次?
Why JavaFX TextField listener repeats 3 times?
我正在尝试跟踪对 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次。
但我希望控制台应该只显示 "NOT Accepted" 并且不应该重复 2 次以上。
我建议使用简单的 TextFormatter
,而不是使用 ChangeListener
。这允许您在不触发另一个事件的情况下阻止更改。
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;
}));
我正在尝试跟踪对 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次。 但我希望控制台应该只显示 "NOT Accepted" 并且不应该重复 2 次以上。
我建议使用简单的 TextFormatter
,而不是使用 ChangeListener
。这允许您在不触发另一个事件的情况下阻止更改。
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;
}));