Java 将每个值转换为毫秒

Java 将每个值转换为毫秒,java,javafx,javafx-8,Java,Javafx,Javafx 8,我有一个微调器,我想用它来配置任务的时间。在这种情况下,我无法使用微调器和Combobox设置数值以小时或分钟为单位来转换数值: import java.util.concurrent.TimeUnit; import javafx.application.Application; import static javafx.application.Application.launch; import javafx.beans.value.ChangeListener; import java

我有一个微调器,我想用它来配置任务的时间。在这种情况下,我无法使用微调器和Combobox设置数值以小时或分钟为单位来转换数值:

  import java.util.concurrent.TimeUnit;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MainApp extends Application
{
    @Override
    public void start(Stage stage) throws Exception
    {
        Spinner spinner = new Spinner();
        spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 10000));
        spinner.setEditable(true);

        ComboBox comb = new ComboBox();
        comb.getItems().addAll(
            "Milliseconds",
            "Seconds",
            "Minutes",
            "Hours",
            "Days"
        );
        comb.getSelectionModel().selectFirst();

        spinner.valueProperty().addListener(new ChangeListener<Number>()
        {
            @Override
            public void changed(ObservableValue<? extends Number> ov, Number old_val, Number new_val)
            {
                String value = comb.getSelectionModel().getSelectedItem().toString();

                long convertedValue = 0;

                switch (Integer.parseInt(spinner.getValue().toString()))
                {
                    case 1:
                        value = "Milliseconds";
                        convertedValue = Integer.parseInt((String) spinner.getValue());

                        break;
                    case 2:
                        value = "Seconds";
                        convertedValue = TimeUnit.SECONDS.toMillis((long) spinner.getValue());

                        break;
                    case 3:
                        value = "Minutes";
                        convertedValue = TimeUnit.MINUTES.toMillis((long) spinner.getValue());

                        break;
                    case 4:
                        value = "Hours";
                        convertedValue = TimeUnit.HOURS.toMillis((long) spinner.getValue());

                        break;
                    case 5:
                        value = "Days";
                        convertedValue = TimeUnit.DAYS.toMillis((long) spinner.getValue());

                        break;

                }

                System.out.println(">>>>> " + convertedValue);
            }
        });

        HBox hb = new HBox();
        hb.getChildren().addAll(spinner, comb);
        hb.setSpacing(50);

        Scene scene = new Scene(hb);

        stage.setTitle("JavaFX and Maven");
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }

}
import java.util.concurrent.TimeUnit;
导入javafx.application.application;
导入静态javafx.application.application.launch;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.control.ComboBox;
导入javafx.scene.control.Spinner;
导入javafx.scene.control.SpinnerValueFactory;
导入javafx.scene.layout.HBox;
导入javafx.stage.stage;
公共类MainApp扩展应用程序
{
@凌驾
public void start(Stage)引发异常
{
微调器微调器=新微调器();
spinner.setValueFactory(新的SpinnerValueFactory.IntegerSpinnerValueFactory(0,10000));
微调器.setEditable(true);
ComboBox comb=新ComboBox();
comb.getItems().addAll(
“毫秒”,
“秒”,
“分钟”,
“小时”,
“天”
);
comb.getSelectionModel().selectFirst();
spinner.valueProperty().addListener(新的ChangeListener())
{
@凌驾

public void changed(observeValue这一个怎么样?我猜代码示例中的主要错误是在switch语句中,您切换的是微调器值,而不是组合框值。 本例纠正了您的问题,在System.out.println(…)中,最后您可以看到原始值和要打印的转换值。您可以在应用程序中进一步使用它

编辑:我在您的评论中添加了提示。现在您可以以毫秒、秒、秒为单位输入任何时间(记住按enter键-否则不会触发事件),然后在组合框更改后,您更改的值将写入微调器-您希望放大微调器中的最大值以允许以毫秒为单位输入更高的值)。 它也是基于整数计算的。因此,时间的舍入调整将丢失

import java.util.concurrent.TimeUnit;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Spinner;
import javafx.scene.control.SpinnerValueFactory;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;

public class MainApp extends Application {

    long    milliSeconds;
    String  unitAtLastChange;
    int     originalValue;

    @Override
    public void start(Stage stage) throws Exception {
        Spinner<Integer> spinner = new Spinner<>();
        spinner.setValueFactory(new SpinnerValueFactory.IntegerSpinnerValueFactory(0, 10000));
        spinner.setEditable(true);

        ComboBox<String> comb = new ComboBox<>();
        comb.getItems().addAll("Milliseconds", "Seconds", "Minutes", "Hours", "Days");
        comb.getSelectionModel().selectFirst();
        this.unitAtLastChange = comb.getSelectionModel().getSelectedItem();

        spinner.valueProperty().addListener(new ChangeListener<Integer>() {
            @Override
            public void changed(ObservableValue<? extends Integer> ov, Integer old_val, Integer new_val) {
                MainApp.this.unitAtLastChange = comb.getSelectionModel().getSelectedItem();
                MainApp.this.originalValue = new_val.intValue();

                switch (MainApp.this.unitAtLastChange) {
                    case "Milliseconds":
                        MainApp.this.milliSeconds = new_val.intValue();

                        break;
                    case "Seconds":
                        MainApp.this.milliSeconds = TimeUnit.SECONDS.toMillis(new_val.intValue());

                        break;
                    case "Minutes":
                        MainApp.this.milliSeconds = TimeUnit.MINUTES.toMillis(new_val.intValue());

                        break;
                    case "Hours":
                        MainApp.this.milliSeconds = TimeUnit.HOURS.toMillis(new_val.intValue());

                        break;
                    case "Days":
                        MainApp.this.milliSeconds = TimeUnit.DAYS.toMillis(new_val.intValue());
                        break;
                    default:
                        throw new RuntimeException("Error - wrong value");

                }

                System.out.println("Converted: " + MainApp.this.originalValue + " " + MainApp.this.unitAtLastChange + " Original: "
                        + MainApp.this.milliSeconds + " Milliseconds");
            }
        });

        comb.valueProperty().addListener(new ChangeListener<String>() {

            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                switch (newValue) {
                    case "Milliseconds":
                        MainApp.this.originalValue = (int) MainApp.this.milliSeconds;

                        break;
                    case "Seconds":
                        MainApp.this.originalValue = (int) TimeUnit.MILLISECONDS.toSeconds(MainApp.this.milliSeconds);

                        break;
                    case "Minutes":
                        MainApp.this.originalValue = (int) TimeUnit.MILLISECONDS.toMinutes(MainApp.this.milliSeconds);

                        break;
                    case "Hours":
                        MainApp.this.originalValue = (int) TimeUnit.MILLISECONDS.toHours(MainApp.this.milliSeconds);

                        break;
                    case "Days":
                        MainApp.this.originalValue = (int) TimeUnit.MILLISECONDS.toDays(MainApp.this.milliSeconds);
                        break;
                    default:
                        throw new RuntimeException("Error - wrong value");

                }
                spinner.getValueFactory().setValue(Integer.valueOf(MainApp.this.originalValue));
            }
        });

        HBox hb = new HBox();
        hb.getChildren().addAll(spinner, comb);
        hb.setSpacing(50);

        Scene scene = new Scene(hb);

        stage.setTitle("JavaFX and Maven");
        stage.setScene(scene);
        stage.show();

    }

    public static void main(String[] args) {
        launch(args);
    }

}
import java.util.concurrent.TimeUnit;
导入javafx.application.application;
导入javafx.beans.value.ChangeListener;
导入javafx.beans.value.observeValue;
导入javafx.scene.scene;
导入javafx.scene.control.ComboBox;
导入javafx.scene.control.Spinner;
导入javafx.scene.control.SpinnerValueFactory;
导入javafx.scene.layout.HBox;
导入javafx.stage.stage;
公共类MainApp扩展应用程序{
长毫秒;
字符串unitAtLastChange;
内在原始价值;
@凌驾
public void start(Stage)引发异常{
微调器微调器=新微调器();
spinner.setValueFactory(新的SpinnerValueFactory.IntegerSpinnerValueFactory(0,10000));
微调器.setEditable(true);
ComboBox comb=新ComboBox();
comb.getItems().addAll(“毫秒”、“秒”、“分钟”、“小时”、“天”);
comb.getSelectionModel().selectFirst();
this.unitAtLastChange=comb.getSelectionModel().getSelectedItem();
spinner.valueProperty().addListener(新的ChangeListener()){
@凌驾

更改公众假期(ObservalEvalue我还需要问一件事。当我已经定义了以毫秒为单位的值时,我如何根据选定的ComboBox将其转换为微调器?仅供参考:主要的变化是,现在ComboBox也有一个侦听器。在这个侦听器上,微调器的值更改为ComboBox中新选定的单位是否有任何选项如何缩小代码?可能通过使用绑定?为什么不使用组合框?