Java 在用户在JDateChooser中选择出生日期后在文本字段中显示年龄
我的程序中有一个JDateChooser。无论何时从JDateChooser选择他的出生日期,我都希望他的年龄显示在JTextField中 最初,我试图让鼠标听器工作,如下所示:Java 在用户在JDateChooser中选择出生日期后在文本字段中显示年龄,java,listener,jdatechooser,Java,Listener,Jdatechooser,我的程序中有一个JDateChooser。无论何时从JDateChooser选择他的出生日期,我都希望他的年龄显示在JTextField中 最初,我试图让鼠标听器工作,如下所示: private void jDateChooser1MouseExited(java.awt.event.MouseEvent evt) { Calendar dob = Calendar.getInstance();
private void jDateChooser1MouseExited(java.awt.event.MouseEvent evt)
{
Calendar dob = Calendar.getInstance();
//utilDob is a java.util.Date variable which stores date selected by user
dob.setTime(utilDob);
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (today.get(Calendar.MONTH) < dob.get(Calendar.MONTH))
age--;
else if (today.get(Calendar.MONTH) == dob.get(Calendar.MONTH)
&& today.get(Calendar.DAY_OF_MONTH) < dob.get(Calendar.DAY_OF_MONTH))
age--;
jTextField11.setText(Integer.toString(age));
displayAge=Integer.parseInt(jTextField11.getText());
}
private void jDateChooser1MouseExited(java.awt.event.MouseEvent evt)
{
Calendar dob=Calendar.getInstance();
//utilDob是一个java.util.Date变量,用于存储用户选择的日期
目标设定时间(utilDob);
Calendar today=Calendar.getInstance();
int age=today.get(Calendar.YEAR)-dob.get(Calendar.YEAR);
如果(今天获取(日历月)
但是,上述功能对我没有帮助。是否还有其他事件/操作侦听器可以使用?您使用的是过时的类 java.time Java8及更高版本内置了Java.time框架
LocalDate
该类表示一个仅限日期的值,不含一天中的时间和时区。但时区是决定“今天”的关键。对于任何给定的时刻,世界各地的日期可能因时区而异。午夜过后的几分钟,巴黎的蒙特勒尔仍然是“昨天”
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
根据用户输入生成出生日期
LocalDate dob = LocalDate.of ( 1955 , 1 , 2 );
或者分析符合标准的字符串
LocalDate dob = LocalDate.parse( "1955-01-02" );
或者使用DateTimeFormatter
帮助解析不同的字符串
如果您手头有一个java.util.Date
对象,请使用添加到旧类中的新方法转换为java.time:java.util.Date::toInstant
。即时
是UTC时间线上的一个时刻
Instant instant = myJavaUtilDate.toInstant();
苹果是一个时区
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
提取一个LocalDate
LocalDate localDate = zdt.toLocalDate();
Period
年龄只是一种流逝的时间,一段时间。在java.time中,Period
类表示以年、月和日为单位跟踪的时间跨度
Period age = Period.between ( dob , today );
从期间获取年份
如果这就是你想要的,那就问问这些年吧
int years = age.getYears ();
请注意,getYears
没有按照您的直觉标准化为完整的年数。根据时段
的构造方式,您可能会得到意外的结果。另一种方法是调用totalmonths()并除以12(十二个月到一年)。在这个快速的例子中,可以看到这两种方法;比较y
和y2
Period p = Period.ofMonths ( 25 );
int y = p.getYears ();
long y2 = ( ( p.toTotalMonths () ) / 12 );
System.out.println ( "p: " + p + " | y: " + y + " | y2: " + y2 );
p:P25M | y:0 | y2:2
更妙的是,强制将期间
对象标准化为年、月、日的完整计数。好的,不完全强制对象:因为,您实际上是基于原始对象的值实例化一个新对象
因此,尽管我们的age
对象由于其特殊的构造而恰好已经被规范化,但始终调用normalized
可能是一个好习惯
Period age = Period.between ( dob , today ).normalized();
转储到控制台。默认情况下,Period::toString
方法根据此处所示的P61Y2M27D
生成字符串
System.out.println ( "zoneid: " + zoneId + " | today: " + today + " | dob: " + dob + " | age: " + age + " | years: " + years );
地区:美国/蒙特利尔|今天:2016-03-29 |出生日期:1955-01-02 |年龄:P61Y2M27D |年龄:61岁
将int
转换为Integer
最后,如果需要对象而不是原语,请将int
转换为Integer
整数年sobj=整数.valueOf(年) 你没有告诉我们这个问题,只是它不起作用。一定要包括一个简明的问题,总结已经发生的事情,并将其与应该发生的事情进行对比。问题是代码没有计算年龄。函数似乎一开始就没有执行,所以它“似乎”没有执行。你应该在来这里之前调试一下。。。但是无论如何,在函数的某个地方放一个print语句。只是一个很好的ole normal
System.out.println(“随便什么”)在函数中,如果您看到控制台中弹出“Whatever”,则可以看到函数是否正在被调用。它不会打印语句。感谢您的回复。我的程序中有一个JDateChooser,用户将在其中选择他/她的出生日期,因此我使用了java.util.date。如何将从JDatechooser中选择的日期存储到LocalDate变量中?@ninjacoder从该实用程序中获取的对象是什么?我找不到它的JavaDoc或任何指南文档。我正在使用toedter的JDateChooser