【发布时间】:2020-04-26 00:55:42
【问题描述】:
我正在编写一个 bean(我正在学习 Java 和 Java bean),它是一个扩展 JLabel 的数字手表。显示的文本为hh:mm:ss。
当我尝试在新项目中使用组件(手表)时,它默认显示系统日期(我将 bean 编程为以这种方式工作)。但是我想允许开发人员(在这种情况下是我自己)可以编辑属性“hora”来设置不同的日期。所以如果开发者在一个新项目中插入组件,文本必须是系统的时间。但是,如果开发人员编辑属性“hora”并设置一个新日期,例如多一小时,则显示的文本应该是新值,在本例中为system date + 1 hour。
我当前的代码部分工作:
在上一张图片中:
- 右侧属性“hora”的值是:系统日期 + 1 小时。
- NetBeans 的预览视图左侧显示正确的时间(系统时间 + 1 小时)。分钟的差异是因为手表每秒钟都在工作并改变它的时间。屏幕截图是在编辑属性值几分钟后制作的。
- 在中心项目正在运行并显示错误的日期(系统日期)。
- 请忽略按钮和微调器,它们仅用于测试目的。
如何改变这种行为?那么当我运行项目时,显示的时间与“hora”属性中选择的时间相同吗?
相关代码:
public class Reloj extends JLabel implements Serializable {
private Date hora = new Date();
private SimpleDateFormat formatoHora;
private boolean doceHoras = false;
public Reloj() {
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
setHora(new Date((getHora().getTime())+1000));
}
}, 0, 1000);
}
public Date getHora() {
return this.hora;
}
public void setHora(Date hora) {
this.hora = hora;
this.setText(this.getFormatoHora().format(hora));
this.repaint();
}
public SimpleDateFormat getFormatoHora() {
if (this.isDoceHoras()) {
this.formatoHora = new SimpleDateFormat("hh:mm:ss a");
} else {
this.formatoHora = new SimpleDateFormat("HH:mm:ss");
}
return this.formatoHora;
}
public void setDoceHoras(boolean doceHoras) {
this.doceHoras = doceHoras;
this.setHora(hora);
}
}
感谢您的帮助,对不起我的英语。
【问题讨论】:
-
您使用的是什么 Java 版本?如果您正在编译 Java 8+,请考虑使用
java.time而不是java.util... -
开发者如何输入修改后的日期?您的代码没有显示 - 我怀疑
setHora(Date)会在某个时候被调用,但由于用户只能输入一些 text ,因此缺少将该文本解析为正确的Date对象。另请注意,您的计时器不是线程安全的,因此用户的输入可能会丢失。 -
@deHaar 我使用的是 Java 8。
java.time和java.util有什么不同?我如何使用java.time来获得我需要的东西? -
@Thomas 开发人员只需单击属性值并编辑新日期。例如,如果系统日期为
08-Jan-2020 17:38:38,则手动将其更改为08-Jan-2020 18:38:38。 -
包完全不同...例如在
java.time中,您可以像这样为LocalTime添加一个小时:LocalTime nowPlusOneHour = LocalTime.now().plusHours(1);。您甚至可以传递时区 (ZoneId) 或只是偏移到某些对象,并轻松地将日期时间从一个区域转换为另一个区域。看看the Oracle tutorial,这也解释了为什么你应该切换到java.time。
标签: java swing date javabeans jlabel