JavaFx:如何根据差异b / w两次更新小时数?

时间:2017-06-12 11:11:59

标签: java javafx javafx-2 javafx-8 jfoenix

我正在 JavaFx 中开发一个应用程序,其中我正在使用 jfoenix库 Java 8 Time 。在我的应用程序中,我有两个 TimePickers 和一个 TextField 。所有节点最初设置为11:00 ,如下所示:

enter image description here

我想要的是 TimePickers 之间的差异,假设 Time1 9:00 AM 时间2 上午11:00 ,因此差异 2 ,因此添加2小时 TextField 中已经存在的值 11:00 ,因此它将变为 13:00 如果用户将时间2 更改为 10:00 AM ,那么现在差异将为1 ,因此添加1小时 TextField 初始值 11:00 (不是当前13:00的新值)并将其设为 12:00 。请帮助我如何实现。

在我目前的代码中,问题是它是基于新值(例如13:00)更新而不是基于初始值(例如11:00),如果当前值是13:00并且差异是1所以它是14:00而不是12:00: -

import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

import com.jfoenix.controls.JFXTimePicker;

import javafx.beans.value.ChangeListener;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;

public class SampleController {

    @FXML
    JFXTimePicker tp1;
    @FXML
    JFXTimePicker tp2;
    @FXML
    TextField tf1;

    public void initialize() {
        tp1.setValue(LocalTime.of(11, 00));
        tp2.setValue(LocalTime.of(11, 00));

        tf1.setText("11:00");
        tf1.setEditable(false);

        ChangeListener<Object> listener = (obs, oldValue, newValue) -> 
        update(tp1.getValue().toString(), tp2.getValue().toString(), tf1.getText(), tf1);

        tp1.valueProperty().addListener(listener);
        tp2.valueProperty().addListener(listener);

    }

    public void update (String t1, String t2, String tf, TextField textField) {
        DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");
        LocalTime parseTime1 = LocalTime.parse(t1,format);
        LocalTime parseTime2 = LocalTime.parse(t2,format);

        long diffT1AndT2 = ChronoUnit.MINUTES.between(parseTime1, parseTime2);

        LocalTime parseTime3InTextField = LocalTime.parse(tf,format);
        LocalTime add = parseTime3InTextField.plusMinutes(diffT1AndT2);
        tf1.setText(add.toString());
    }   
}

1 个答案:

答案 0 :(得分:0)

一种方法是存储tf1文本字段的初始值,并将该初始值而不是每次更新的值传递给更新方法。

public void initialize() {
        tp1.setValue(LocalTime.of(11, 00));
        tp2.setValue(LocalTime.of(11, 00));

        String tf1Text = "11:00";   // added the initial value 
        tf1.setText(tf1Text);
        tf1.setEditable(false);

       /*Passing the initial String here instead of the updated value */
        ChangeListener<Object> listener = (obs, oldValue, newValue) -> 
        update(tp1.getValue().toString(), tp2.getValue().toString(), tf1Text , tf1);  

        tp1.valueProperty().addListener(listener);
        tp2.valueProperty().addListener(listener);

    }

    public void update (String t1, String t2, String tf, TextField textField) {
        DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");
        LocalTime parseTime1 = LocalTime.parse(t1,format);
        LocalTime parseTime2 = LocalTime.parse(t2,format);

        long diffT1AndT2 = ChronoUnit.MINUTES.between(parseTime1, parseTime2);

        LocalTime parseTime3InTextField = LocalTime.parse(tf,format);
        LocalTime add = parseTime3InTextField.plusMinutes(diffT1AndT2);
        tf1.setText(add.toString());
    }   
}