如何设置文本字段的格式 [英] How to format a text field javafx
本文介绍了如何设置文本字段的格式的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我希望能够以hh:mm:ss格式在JavaFX文本字段中输入时间。我该如何设置文本字段的格式?我已经获得了regex方法,因此它只接受数字作为输入:
public void format(TextField t, String regex){
TextFormatter<String> formatter = new TextFormatter<String>( change -> {
change.setText(change.getText().replaceAll(regex, ""));
return change;
});
t.setTextFormatter(formatter);
}
我还得到了一个限制文本字段中允许的字符数的方法:
public void limitLength(int maxLength, TextField t){
t.lengthProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observable,
Number oldValue, Number newValue) {
if (newValue.intValue() > oldValue.intValue()) {
// Check if the new character is greater than LIMIT
if (t.getText().length() >= maxLength) {
t.setText(t.getText().substring(0, maxLength));
}
}
}
});
}
但是,这些都不能帮助我获得我想要的时间格式。理想的情况是初始文本为00:00:00,用户只能编辑数字,不能触摸冒号。如果我能确保每个冒号之间有两个数字,那就太棒了,即用户应该不能移动数字,就像这样0:000:00。
谢谢您的帮助。
推荐答案
使用简单日期格式
已经有一个专门为设置日期格式而设计的类,可以与TextField
's textFormatter
:SimpleDateFormat
TextField tf = new TextField();
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss");
tf.setTextFormatter(new TextFormatter<>(new DateTimeStringConverter(format), format.parse("00:00:00")));
有关字符含义的更详细说明,请参阅SimpleDateFormat
的javadoc。
使用3个不同的文本字段
您还可以使用3个不同的TextField
,并删除背景和边框并将它们放入HBox
中,以获得不可编辑的:
s:
TextField hours = new TextField();
TextField minutes = new TextField();
TextField seconds = new TextField();
StringConverter<Integer> minSecConverter = new IntRangeStringConverter(0, 59);
minutes.setTextFormatter(new TextFormatter<>(minSecConverter, 0));
seconds.setTextFormatter(new TextFormatter<>(minSecConverter, 0));
hours.setTextFormatter(new TextFormatter<>(new IntRangeStringConverter(0, 23), 0));
prepareTextField(hours);
prepareTextField(minutes);
prepareTextField(seconds);
HBox fields = new HBox(hours, createLabel(),minutes, createLabel(), seconds);
fields.setPadding(new Insets(4));
fields.setStyle("-fx-background-color: white;");
public static void prepareTextField(TextField tf) {
tf.setAlignment(Pos.CENTER);
tf.setBackground(Background.EMPTY);
tf.setBorder(Border.EMPTY);
tf.setPadding(Insets.EMPTY);
tf.setPrefColumnCount(2);
}
public static class IntRangeStringConverter extends StringConverter<Integer> {
private final int min;
private final int max;
public IntRangeStringConverter(int min, int max) {
this.min = min;
this.max = max;
}
@Override
public String toString(Integer object) {
return String.format("%02d", object);
}
@Override
public Integer fromString(String string) {
int integer = Integer.parseInt(string);
if (integer > max || integer < min) {
throw new IllegalArgumentException();
}
return integer;
}
}
public static Label createLabel() {
Label label = new Label(":");
label.setPrefWidth(3);
return label;
}
这篇关于如何设置文本字段的格式的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文