Java 将每个值转换为毫秒
我有一个微调器,我想用它来配置任务的时间。在这种情况下,我无法使用微调器和Combobox设置数值以小时或分钟为单位来转换数值: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
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中新选定的单位是否有任何选项如何缩小代码?可能通过使用绑定?为什么不使用组合框?