公历JavaFX

公历JavaFX,java,javafx,gregorian-calendar,Java,Javafx,Gregorian Calendar,我一直在想这个问题。它是关于JavaFX控件在按enter键时为月份、数字日期和年份选择日期的名称。。我甚至尝试使用面向对象来解决这个问题。问题在图片链接中 新的编辑和代码:我休息一天来获取一周中的某一天,例如2012年1月1日应该是第一天,因为控制台中的答案是:一周中的某一天:1而不是2 public class DayOfWeek extends Application { private String[] months = { "JANUARY", "FEBRUARY", "MARCH

我一直在想这个问题。它是关于JavaFX控件在按enter键时为月份、数字日期和年份选择日期的名称。。我甚至尝试使用面向对象来解决这个问题。问题在图片链接中

新的编辑和代码:我休息一天来获取一周中的某一天,例如2012年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);
}
}
公共类DayOfWeek扩展了应用程序{
私有字符串[]个月={“一月”、“二月”、“三月”、“四月”、“五月”、“六月”、“七月”、“八月”、“九月”,
“十月”、“十一月”、“十二月”};
私人字符串[]天={“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" };
字符串s1=“”;
int k=0;
字符串s2=“”;
int x=0;
@凌驾
公共无效开始(阶段primaryStage){
//添加网格窗格
GridPane grid=新建GridPane();
网格设置填充(新的插图(10,10,10,10));
//为原始邮件左上方添加标签
标签1=新标签(“月份”);
setConstraints(标签1,0,0);
ListView lv=新的ListView(FXCollections.observableArrayList(月));
lv.setPrefSize(100100);
lv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
设置约束(lv,1,0);
标签标签2=新标签(“日期:”);
setConstraints(标签2,2,0);
ListView lvdays=新的ListView(FXCollections.observableArrayList(天));
lvdays.setPrefWidth(50);
lvdays.setPrefHeight(75);
lv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
setConstraints(lvdays,3,0);
标签3=新标签(“年份”);
setConstraints(标签3,4,0);
TextField textfield3=新的TextField();
setConstraints(textfield3,5,0);
lv.设置鼠标点击(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.按下设置键(e3->{
if(e3.getCode()==KeyCode.ENTER){
GregorianCalendar cal2=新的GregorianCalendar(textfield3.getLength(),k,x);
System.out.println(“星期几:+cal2.get(日历.星期几));
}
});
//将其添加到父级
grid.getChildren().addAll(label1、lv、label2、lvdays、label3、textfield3);
//设置一个场景并放置它
场景=新场景(网格,600200);
初级阶段。设置标题(“星期日”);
初级阶段。场景(场景);
primaryStage.show();
}
公共静态void main(字符串[]args){
应用程序启动(args);
}
}

首先,不要在列表视图中填充字符串。使用
Integer
对象从
month.values()
和月份的天数填充月份列表视图。这将在取出所选项目时更加方便,并将节省您在类顶部声明数组的时间

在下面的例子中,我假设不是
s1
,而是一个名为
m
的变量,该变量的类型为
Month
,而
s2
的类型为
Integer
(您应该找到一个更好的名称)

避免使用
gregorianalendar
。那个类设计得很糟糕,幸运的是早已过时。而是使用java.time中的
LocalDate
,这是现代java日期和时间API

gregoriacalendar
构造函数相对的
LocalDate.of
方法将在向其传递无效值时引发异常,例如2019年2月29日。这将帮助您根据需要向用户报告无效日期

代码中出现了什么错误?

  • 您当年使用的是
    textfield3.getLength()
    。假设输入一个四位数的年份,这将是第四年(那是几千年前的事了)
  • 当您使用月日的
    lvdays.getSelectionModel().getSelectedIndex()
    时,您在列表视图的列表中得到了基于0的索引。因此,当用户选择
    1
    时,您得到的是0,以此类推
其他提示:学会发明好的变量名。它确实区分了有价值的代码和无价值的代码。此外,在询问有关堆栈溢出的问题时,如果人们能够轻松阅读您的代码,那么他们将更有可能帮助您,而变量名
s1
s2
k
x
则不能

链接


解释如何使用java.time。

在请求错误帮助时,实际包含收到的错误非常重要。请阅读本文并提供一个演示问题的示例。查看
ListView
TextField
和API以获得更合适的侦听器。谢谢。我仍然需要帮助解决这个问题。如何连接鼠标单击包含两个ListView的滚动窗格和按enter键时按下的SetOnKeys。到目前为止,我无法将它们作为变量。基本上,如何让两个事件处理程序执行操作并与另一个事件处理程序连接。在上面,我有e和e2需要与事件处理程序e3连接。安排操作和选择侦听器调用一个公共方法来验证当前条目并更新状态显示。坦率地说,这是问题中一个blxxdx可怕的提示。
gregorianalendar
类的设计很差,而且早已过时。改为使用中的
LocalDate
from。
            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);
            }