使用javaFX解析字符串输入
问题描述:
我目前正在开发一个项目,对Java很新,并且很难理解它与C#等语言相比的工作原理。使用javaFX解析字符串输入
我需要的是采取一个用户提交日期(字符串),并验证它是使用JavaFX的MM/DD/YYYY格式。
我一直在googling如何做一段时间,但没有发现我的解决方案似乎工作。
这里是GUI:http://puu.sh/bZcmg/8a33901e28.png
这是我的控制器(到目前为止):
public class FXMLNewLabSchedulerDocController implements Initializable {
@FXML
private TextField txtRequestorName;
@FXML
private TextField txtRequestorEmail;
@FXML
private TextField txtEventTitle;
@FXML
private TextField txtNumParticipants;
@FXML
private TextField txtEventDate;
@FXML
private TextField txtStartTime;
@FXML
private TextField txtEndTime;
@FXML
private ToggleButton togStartTime;
@FXML
private ToggleButton togEndTime;
@FXML
private CheckBox chkPrinter;
@FXML
private RadioButton rbYes;
@FXML
private RadioButton rbNo;
@FXML
private TextArea txtareaMessage;
@FXML
private void handleBtnSubmit(ActionEvent event) {
System.out.println("You clicked me!");
}
@FXML
private void handleBtnClear(ActionEvent e) {
System.out.println("Clear All Fields!");
txtRequestorName.setText("");
txtRequestorEmail.setText("");
txtEventTitle.setText("");
txtNumParticipants.setText("");
txtEventDate.setText("");
txtStartTime.setText("");
txtEndTime.setText("");
chkPrinter.setSelected(false);
rbYes.setSelected(false);
rbNo.setSelected(false);
txtareaMessage.setText("");
}
@FXML
private void handleBtnClose(ActionEvent event) {
System.out.println("Application Close!");
Platform.exit();
}
@Override
public void initialize(URL url, ResourceBundle rb) {
txtareaMessage.editableProperty().bind(rbYes.selectedProperty());
}
}
答
不可能不管Java或其他开发环境的
,有没有办法做到这一点完美。一月一号还是二月二号是01/02/2014
?不可能知道。您必须:
- 请相信用户是正确的。也许提供诸如视觉日历或将日期拼写为文本的反馈。
- 提供日期选取器工具,而不是依赖于输入的输入。
你可以看到他们键入的是而不是这种格式。尝试将字符串转换为日期数据类型。如果引发了不正确的格式异常,那么你知道用户错了。如果没有抛出异常,那么也许是用户说得对。
我记得,JavaFX包含一个日期选择器小部件。我建议你考虑使用那个或另一个第三方小部件。
避免j.u.Date
与Java的早期版本开始,你会发现java.util.Date和java.util.Calendar中的类与类java.text.SimpleDateFormat一起。避免这些类。它们在设计和实现方面都出了名的麻烦,缺陷。
而是使用两种:
- 的Joda-Time库。
-
java.time package
(与Java 8捆绑在一起,受Joda-Time的启发,由JSR 310定义)。
日期 - 只有
要验证你需要一个日期,只有一流的日期,没有任何时间的日或时区。 Joda-Time和java.time都为此提供了一个LocalDate
类,而java.util.Date/Calendar则没有。
约达时间使用Joda-Time 2.4
实施例的代码。
String input = "01/02/2014";
DateTimeFormatter formatter = DateTimeFormat.forPattern("M/d/yyyy"); // Single `M` and `d` allows user to enter single or double digits.
LocalDate localDate = null;
try {
localDate = formatter.parseLocalDate(input);
} catch (IllegalArgumentException e) {
// FIXME: Handle the user input in wrong format.
}
生成文本作为反馈给用户。
DateTimeFormatter formatterOutput = DateTimeFormat.forStyle("F-").withLocale(Locale.US);
String output = formatterOutput.print(localDate);
转储到控制台。
System.out.println("input: " + input);
System.out.println("localDate: " + localDate);
System.out.println("output: " + output);
运行时。
input: 01/02/2014
localDate: 2014-01-02
output: Thursday, January 2, 2014
奖金提示:了解DateTime
类,Interval
类,UTC,ISO 8601和time zones。
您的问题确实是重复的,这些主题在StackOverflow的许多问题和解答中都有处理。所以搜索要做更多的学习。