应用文本格式化程序后无法在 JavaFX TextField 中退格第一个字符
Can't backspace first character in JavaFX TextField after applying a Text formatter
我正在尝试在我的 TextField 上应用正则表达式模式,以便用户只能键入字符、数字和空格,但我不希望开头有任何空格或数字。 (我不能在输入后删除空格)。我使用正则表达式和下面的代码来实现这一点,但是一旦输入第一个字符,它就不能用退格键删除并永久保留在那里,而任何其他不在第一个位置的字符都可以退格。我该如何解决这个问题并确保整个 TextField 可以退格?
我正在使用 javaFX 8。
import java.io.File;
import java.util.function.UnaryOperator;
import java.util.regex.Pattern;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class test extends Application{
@Override
public void start(Stage primaryStage) {
try{
TextField user = new TextField();
Pattern pattern = Pattern.compile("[a-zA-Z][a-zA-Z0-9 ]*");
UnaryOperator<TextFormatter.Change> filter = string -> {
if (pattern.matcher(string.getControlNewText()).matches()) {
return string ;
} else {
return null ;
}
};
TextFormatter<String> formatter = new TextFormatter<>(filter );
user.setTextFormatter(formatter);
//username submit button
Button submitButton = new Button("Submit");
//submit action for button
Label userPrompt = new Label("Enter name");
Stage stage = new Stage();
stage.setTitle("Username Entry");
VBox userEntry = new VBox(userPrompt,user , submitButton);
Scene scene1 = new Scene((userEntry),400,300);
stage.setScene(scene1);
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
检查空字符串,或更改您的正则表达式以匹配空字符串。
这个正则表达式:
Pattern.compile("[a-zA-Z0][a-zA-Z0-9 ]*");
表示“恰好是一个字母字符(或零),后跟任意数量的空格或字母数字字符。”
您可以在表达式的开头或结尾放置一个 |
以匹配空字符串:
Pattern.compile("|[a-zA-Z0][a-zA-Z0-9 ]*");
另一种方法是显式检查空字符串:
Pattern pattern = Pattern.compile("[a-zA-Z0][a-zA-Z0-9 ]*");
UnaryOperator<TextFormatter.Change> filter = string -> {
String newText = string.getControlNewText();
if (newText.isEmpty() || pattern.matcher(newText).matches()) {
return string;
} else {
return null;
}
};
您说“但是我不希望开头有任何空格或数字”,但您的表达式允许零 (0
) 作为初始字符。如果您真的不想在开头使用任何数字,请通过更改此删除零:
Pattern.compile("[a-zA-Z0][a-zA-Z0-9 ]*");
对此:
Pattern.compile("[a-zA-Z][a-zA-Z0-9 ]*");
我正在尝试在我的 TextField 上应用正则表达式模式,以便用户只能键入字符、数字和空格,但我不希望开头有任何空格或数字。 (我不能在输入后删除空格)。我使用正则表达式和下面的代码来实现这一点,但是一旦输入第一个字符,它就不能用退格键删除并永久保留在那里,而任何其他不在第一个位置的字符都可以退格。我该如何解决这个问题并确保整个 TextField 可以退格?
我正在使用 javaFX 8。
import java.io.File;
import java.util.function.UnaryOperator;
import java.util.regex.Pattern;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class test extends Application{
@Override
public void start(Stage primaryStage) {
try{
TextField user = new TextField();
Pattern pattern = Pattern.compile("[a-zA-Z][a-zA-Z0-9 ]*");
UnaryOperator<TextFormatter.Change> filter = string -> {
if (pattern.matcher(string.getControlNewText()).matches()) {
return string ;
} else {
return null ;
}
};
TextFormatter<String> formatter = new TextFormatter<>(filter );
user.setTextFormatter(formatter);
//username submit button
Button submitButton = new Button("Submit");
//submit action for button
Label userPrompt = new Label("Enter name");
Stage stage = new Stage();
stage.setTitle("Username Entry");
VBox userEntry = new VBox(userPrompt,user , submitButton);
Scene scene1 = new Scene((userEntry),400,300);
stage.setScene(scene1);
stage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
检查空字符串,或更改您的正则表达式以匹配空字符串。
这个正则表达式:
Pattern.compile("[a-zA-Z0][a-zA-Z0-9 ]*");
表示“恰好是一个字母字符(或零),后跟任意数量的空格或字母数字字符。”
您可以在表达式的开头或结尾放置一个 |
以匹配空字符串:
Pattern.compile("|[a-zA-Z0][a-zA-Z0-9 ]*");
另一种方法是显式检查空字符串:
Pattern pattern = Pattern.compile("[a-zA-Z0][a-zA-Z0-9 ]*");
UnaryOperator<TextFormatter.Change> filter = string -> {
String newText = string.getControlNewText();
if (newText.isEmpty() || pattern.matcher(newText).matches()) {
return string;
} else {
return null;
}
};
您说“但是我不希望开头有任何空格或数字”,但您的表达式允许零 (0
) 作为初始字符。如果您真的不想在开头使用任何数字,请通过更改此删除零:
Pattern.compile("[a-zA-Z0][a-zA-Z0-9 ]*");
对此:
Pattern.compile("[a-zA-Z][a-zA-Z0-9 ]*");