Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在用户在JDateChooser中选择出生日期后在文本字段中显示年龄_Java_Listener_Jdatechooser - Fatal编程技术网

Java 在用户在JDateChooser中选择出生日期后在文本字段中显示年龄

Java 在用户在JDateChooser中选择出生日期后在文本字段中显示年龄,java,listener,jdatechooser,Java,Listener,Jdatechooser,我的程序中有一个JDateChooser。无论何时从JDateChooser选择他的出生日期,我都希望他的年龄显示在JTextField中 最初,我试图让鼠标听器工作,如下所示: private void jDateChooser1MouseExited(java.awt.event.MouseEvent evt) { Calendar dob = Calendar.getInstance();

我的程序中有一个JDateChooser。无论何时从JDateChooser选择他的出生日期,我都希望他的年龄显示在JTextField中

最初,我试图让鼠标听器工作,如下所示:

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(“随便什么”)