我一直想找出这个问题。这是关于JavaFX控件在按Enter键时选择月份的天名称,数字天和年份的方法。我什至尝试使用面向对象来解决问题。问题在图片链接中。 Here is the question in this link.
新的编辑和代码:我有一天要离开星期几,例如2012年1月1日应该是第1天作为控制台中的答案:星期几:1而不是2。
public class DayOfWeek extends Application {
private String[] months = { "JANUARY", "FEBRUARY", "MARCH", "APRIL", "MAY", "JUNE", "JULY", "AUGUST", "SEPTEMBER",
"OCTOBER", "NOVEMBER", "DECEMBER" };
private String[] days = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16",
"17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31" };
String s1 = "";
int k = 0;
String s2 = "";
int x = 0;
@Override
public void start(Stage primaryStage) {
// add a gridpane
GridPane grid = new GridPane();
grid.setPadding(new Insets(10, 10, 10, 10));
// add a label for original message top left side
Label label1 = new Label("Month: ");
GridPane.setConstraints(label1, 0, 0);
ListView<String> lv = new ListView<>(FXCollections.observableArrayList(months));
lv.setPrefSize(100, 100);
lv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
GridPane.setConstraints(lv, 1, 0);
Label label2 = new Label("Day: ");
GridPane.setConstraints(label2, 2, 0);
ListView<String> lvdays = new ListView<>(FXCollections.observableArrayList(days));
lvdays.setPrefWidth(50);
lvdays.setPrefHeight(75);
lv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
GridPane.setConstraints(lvdays, 3, 0);
Label label3 = new Label("Year: ");
GridPane.setConstraints(label3, 4, 0);
TextField textfield3 = new TextField();
GridPane.setConstraints(textfield3, 5, 0);
lv.setOnMouseClicked(e -> {
s1 = lv.getSelectionModel().getSelectedItem();
k = lv.getSelectionModel().getSelectedIndex();
System.out.println(lv.getSelectionModel().getSelectedItem());
});
lvdays.setOnMouseClicked(e2 -> {
s2 = lvdays.getSelectionModel().getSelectedItem();
x = lvdays.getSelectionModel().getSelectedIndex();
System.out.println(lvdays.getSelectionModel().getSelectedItem());
});
textfield3.setOnKeyPressed(e3 -> {
if (e3.getCode() == KeyCode.ENTER) {
GregorianCalendar cal2 = new GregorianCalendar(textfield3.getLength(), k, x);
System.out.println("Day of Week: " + cal2.get(Calendar.DAY_OF_WEEK));
}
});
// add it to the parent
grid.getChildren().addAll(label1, lv, label2, lvdays, label3, textfield3);
// set a scene and place show it
Scene scene = new Scene(grid, 600, 200);
primaryStage.setTitle("Day of Week");
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
答案 0 :(得分:1)
首先,不要在列表视图中填写字符串。使用Month.values()
对象填充Integer
中的月份列表视图和月份中的日期。当将选定的项目取出时,这将更加方便,并且省去了在类顶部声明数组的麻烦。
在下文中,我假设您有一个名为s1
的变量,类型为m
,而不是Month
,该变量为s2
,类型为Integer
(您应该找到一个更好的名称)。
String yearText = textfield3.getText();
try {
int year = Integer.parseInt(yearText);
LocalDate date = LocalDate.of(year, m, s2);
System.out.println("Day of Week: " + date.getDayOfWeek());
} catch (NullPointerException | NumberFormatException | DateTimeException e) {
System.out.format("Not a valid date: %s %s %d", yearText, m, s2);
}
避免使用GregorianCalendar
。该课程的设计不佳,幸运的是已经过时了。而是使用现代Java日期和时间API java.time中的LocalDate
。
如果将无效值传递给GregorianCalendar
构造函数,则LocalDate.of
方法将引发异常,例如,2019年2月29日。这将帮助您向用户报告无效日期根据需要。
您的代码出了什么问题?
textfield3.getLength()
。假设输入了四位数的年份,那么您将获得第4年(即现在的几千年前)。lvdays.getSelectionModel().getSelectedIndex()
时,您会在列表视图的列表中获得从0开始的索引。因此,当用户选择1
时,您将得到0,依此类推。其他提示:学习发明好的变量名。它确实使有价值的代码与毫无价值的代码有所不同。同样,在对Stack Overflow提出问题时,如果人们可以轻松阅读您的代码(变量名为s1
,s2
,k
和{{1}),他们将更可能为您提供帮助。 x
。
链接
Oracle tutorial: Date Time解释了如何使用java.time。