阳历JavaFX

时间:2019-02-17 00:32:13

标签: java javafx gregorian-calendar

我一直想找出这个问题。这是关于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);
}
}

1 个答案:

答案 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提出问题时,如果人们可以轻松阅读您的代码(变量名为s1s2k和{{1}),他们将更可能为您提供帮助。 x

链接

Oracle tutorial: Date Time解释了如何使用java.time。