1 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個贊
通過使用,您可以從 a和 aLocalDateTime#of(LocalDate,LocalTime)
創(chuàng)建 a?。您現(xiàn)在需要的是一種獲取 a和 a實(shí)例的方法。幸運(yùn)的是,該控件為您提供了它的值,因此我們已經(jīng)完成了。接下來是找到一種從 a獲取 a 的方法。這可以通過使用 a和 a來實(shí)現(xiàn),a 和a 知道如何將 a 轉(zhuǎn)換為 a?,反之亦然。此用例有一個內(nèi)置的:?。LocalDateTime
LocalDate
LocalTime
LocalDate
LocalTime
DatePicker
LocalDate
LocalTime
TextField
TextFormatter
StringConverter
String
LocalTime
StringConverter
LocalTimeStringConverter
一旦我們擁有了DatePicker
和 the,TextFormatter
我們就需要創(chuàng)建一個綁定,該綁定LocalDateTime
從這兩個值創(chuàng)建 a。由于DatePicker
和TextFormatter
都有一個value
屬性,該屬性分別保存 aLocalDate
和 (在本例中LocalTime
為 a ),因此使用 來創(chuàng)建綁定相對簡單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只要文本被“提交”(例如,在獲得焦點(diǎn)Enter時按下) , 的值就會更新TextField。
我構(gòu)建的方式LocalTimeStringConverter意味著它將使用我的Locale和FormatStyle.SHORT來解析和格式化LocalTime. 舉個例子,對我來說這意味著類似3:30 PMor 的東西11:25 AM。
添加回答
舉報