您好,我想创建一个javafx TextField,用户只能在当前订单中输入A11111111A

所以第一个和最后一个输入应该是字母,它们之间应该只是数字。 这是我的代码:

tf.textProperty().addListener(new ChangeListener() { public void changed(final ObservableValue ov, final String oldValue, final String newValue) { String text_of_first_letter = tf.getText().substring(0, 1); if (tf.getText().length() > 1 ) { if(!newValue.matches("\\d*")) { tf.setText(newValue.replaceFirst("[^\\d]", "")); } } else if(tf.getText().length() == 1){ System.out.println("ktu"); tf.setText(newValue.replaceFirst("[^\\d]", text_of_first_letter)); } } }); 

您可以使用TextFormatterString's matches

如果TextField中的文本不符合这三个正则Regex ,则显示旧文本。

 case 1: newVal.matches("[Az]") -> Single alpha character case 2: newVal.matches("[Az]\\d+") -> Alpha character followed by digits case 3: newVal.matches("[Az]\\d+[Az]") -> Alpa character followed by digits than another alpha character. 

完整的应用

 import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.control.TextField; import javafx.scene.control.TextFormatter; import javafx.scene.layout.StackPane; import javafx.stage.Stage; /** * * @author blj0011 */ public class JavaFXApplication149 extends Application { @Override public void start(Stage primaryStage) { TextField textField = new TextField(); textField.setTextFormatter(new TextFormatter<>(c -> { if (c.getControlNewText().isEmpty()) { return c; } if (c.getControlNewText().matches("[Az]") || c.getControlNewText().matches("[Az]\\d+") || c.getControlNewText().matches("[Az]\\d+[Az]")) { return c; } else { return null; } })); StackPane root = new StackPane(textField); Scene scene = new Scene(root, 300, 250); primaryStage.setTitle("Hello World!"); primaryStage.setScene(scene); primaryStage.show(); } /** * @param args the command line arguments */ public static void main(String[] args) { launch(args); } } 

**更新:更改为TextFormatter 。 @kleopatra说这是实现这一目标的正确方法。