Григорианский календарь JavaFX - PullRequest
0 голосов
/ 17 февраля 2019

Я застрял, пытаясь выяснить этот вопрос.Речь идет о контроле JavaFX, который выбирает название дня для месяца, число дня и год при нажатии клавиши ввода. Я даже пытался использовать объектно-ориентированное решение для решения проблемы.Вопрос в картинке по ссылке. Вот вопрос по этой ссылке.

Новые РЕДАКТИРОВАТЬ и Код: я один день, чтобы получить день недели, например, 1 января 2012 года должен быть день 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 голосов
/ 18 февраля 2019

Во-первых, не заполняйте строки в списках.Заполните представление списка месяцев из 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.Этот класс был плохо спроектирован и, к счастью, давно устарел.Вместо этого используйте LocalDate из java.time, современного Java-API даты и времени.

В противоположность конструктору GregorianCalendar метод LocalDate.of выдает исключение, если вы передаете ему недопустимые значения, например, дляпример 29 февраля 2019 года. Это поможет вам сообщить о неверной дате пользователю по мере необходимости.

Что пошло не так в вашем коде?

  • Вы былииспользуя textfield3.getLength() для года.Если предположить, что введен год из четырех цифр, это даст вам год 4 (это уже пару тысячелетий назад).
  • Когда вы использовали lvdays.getSelectionModel().getSelectedIndex() для дня месяца, вы получили индекс на основе 0 всписок в виде списка.Поэтому, когда пользователь выбрал 1, вы получаете 0 и т. Д.

Другой совет: научитесь придумывать хорошие имена переменных.Это действительно делает разницу между ценным и бесполезным кодом.Также, задавая вопрос о переполнении стека, люди с большей вероятностью помогут вам, если смогут легко прочитать ваш код, чего они не могут с именами переменных s1, s2, k и x. * 1038.*

Ссылка

Учебное пособие по Oracle: Дата и время , объясняющие, как использовать java.time.

...