我尝试用JavaFX做一个应用程序。我有一个小问题:
不幸的是,我不能这样做。我希望'/'和'。'总是写在TextField中。我还想在用户编写第四个第一个数字时,TextField将光标设置在'/'后面。因此用户不需要注意'/'和'。'。他只需输入电话号码。
我怎样才能做到这一点 ?
谢谢你的帮助,
伟大
(对不起我的英语不好 ....)
您可以使用TextFormatter
来控制TextField中的文本。
电话号码文本问题中描述的字段应执行以下操作:
/
.
这是一个完成上述所有操作的示例:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class TextFieldFormatter extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage stage) {
final TextField textField = new TextField();
textField.setTextFormatter(new TextFormatter<String>(change -> {
final int oldLength = change.getControlText().length();
int newLength = change.getControlNewText().length();
// Handle backspace
if (newLength < oldLength) return change;
// Add / after 4 characters
// Add . after 7 and 10 characters
// Do not accept more than 13 characters
switch (newLength) {
case 4 :
change.setText(change.getText() + "/");
newLength++;
break;
case 7: case 10:
change.setText(change.getText() + ".");
newLength++;
break;
case 14:
return null;
}
// Set caret position
change.setCaretPosition(newLength);
change.setAnchor(newLength);
return change;
}));
BorderPane root = new BorderPane();
root.setCenter(textField);
Scene scene = new Scene(root, 200, 200);
stage.setScene(scene);
stage.setTitle("TextField Example");
stage.show();
}
}
你可以addListener()
到TextField propertyText
并控制输入。在你的问题中你没有放任何条件所以只需要一个有用的实现,你可以使用这个简单的代码:
TextField field = new TextField();
field.setPromptText("xxxx/xx.xx.xx");
int maxDigits = 13;
field.textProperty().addListener((ObservableValue<? extends String> observable, String oldValue, String newValue) -> {
if (newValue.length() == 4 && oldValue.length() != 5) {
field.setText(newValue + "/");
} else if (newValue.length() == 7 && oldValue.length() != 8 || newValue.length() == 10 && oldValue.length() != 13) {
field.setText(newValue + ".");
}
if (newValue.length() > maxDigits) {
field.setText(oldValue);
}
});
最后,我发现了我在这个项目中搜索的内容:
https://github.com/jidesoft/jidefx-oss
但我根据自己的需要调整了它。我是否为新对象“MyMaskTextField”添加了代码?