1 回答
TA贡献1797条经验 获得超6个赞
通过使用,您可以从 a和 aLocalDateTime#of(LocalDate,LocalTime)
创建 a 。您现在需要的是一种获取 a和 a实例的方法。幸运的是,该控件为您提供了它的值,因此我们已经完成了。接下来是找到一种从 a获取 a 的方法。这可以通过使用 a和 a来实现,a 和a 知道如何将 a 转换为 a ,反之亦然。此用例有一个内置的: 。LocalDateTime
LocalDate
LocalTime
LocalDate
LocalTime
DatePicker
LocalDate
LocalTime
TextField
TextFormatter
StringConverter
String
LocalTime
StringConverter
LocalTimeStringConverter
一旦我们拥有了DatePicker
和 the,TextFormatter
我们就需要创建一个绑定,该绑定LocalDateTime
从这两个值创建 a。由于DatePicker
和TextFormatter
都有一个value
属性,该属性分别保存 aLocalDate
和 (在本例中LocalTime
为 a ),因此使用 来创建绑定相对简单Bindings#createObjectBinding(Callable,Observable...)
。
DatePicker dp = new DatePicker();
// Have to associate the TextFormatter with a TextField
TextFormatter<LocalTime> tf = new TextFormatter<>(new LocalTimeStringConverter());
ObjectBinding<LocalDateTime> binding = Bindings.createObjectBinding(() -> {
LocalDate ld = dp.getValue();
LocalTime lt = tf.getValue();
return ld == null || lt == null ? null : LocalDateTime.of(ld, lt);
}, dp.valueProperty(), tf.valueProperty());
这是一个完整的示例:
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.DatePicker;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.TextFormatter;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.converter.LocalTimeStringConverter;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
public class App extends Application {
@Override
public void start(Stage primaryStage) {
DatePicker datePicker = new DatePicker();
datePicker.setValue(LocalDate.now());
TextField timeField = new TextField();
TextFormatter<LocalTime> timeFieldFormatter =
new TextFormatter<>(new LocalTimeStringConverter());
timeField.setTextFormatter(timeFieldFormatter);
timeFieldFormatter.setValue(LocalTime.now());
HBox dateTimeBox = new HBox(10, datePicker, timeField);
dateTimeBox.setAlignment(Pos.CENTER);
ObjectBinding<LocalDateTime> ldtBinding = Bindings.createObjectBinding(() -> {
LocalDate date = datePicker.getValue();
LocalTime time = timeFieldFormatter.getValue();
return date == null || time == null ? null : LocalDateTime.of(date, time);
}, datePicker.valueProperty(), timeFieldFormatter.valueProperty());
Label ldtLabel = new Label();
ldtLabel.textProperty().bind(Bindings.createStringBinding(() -> {
LocalDateTime dateTime = ldtBinding.get();
return dateTime == null ? null : dateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}, ldtBinding));
VBox root = new VBox(15, dateTimeBox, ldtLabel);
root.setAlignment(Pos.CENTER);
root.setPadding(new Insets(25));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
上面将 a 的文本绑定Label到ObjectBinding<LocalDateTime>. TextFormatter只要文本被“提交”(例如,在获得焦点Enter时按下) , 的值就会更新TextField。
我构建的方式LocalTimeStringConverter意味着它将使用我的Locale和FormatStyle.SHORT来解析和格式化LocalTime. 举个例子,对我来说这意味着类似3:30 PMor 的东西11:25 AM。
添加回答
举报