我尝试用JavaFX做一个应用程序。 我有一个小问题:
不幸的是,我无法做到这一点。 我希望那样' /'和'。'总是写在TextField中。 我还希望当用户编写第四个第一个数字时,TextField将光标设置在' /'后面。因此,用户不必照顾' /'和'。'。他只需输入电话号码即可。
我该怎么做?
感谢您的帮助,
Mikis
(抱歉我的英文......)
答案 0 :(得分:0)
您可以使用TextFormatter
来控制TextField中的文本。
问题中描述的PhoneNumber 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();
}
}
答案 1 :(得分:0)
您可以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);
}
});
答案 2 :(得分:0)
最后,我发现了我在这个项目中搜索的内容:
https://github.com/jidesoft/jidefx-oss
但我根据自己的需要调整了它。我是否为新对象“MyMaskTextField”添加了代码?