1

我仍在为我的日历程序使用 Java 上已弃用的 setYear() ,并且它以某种方式显示同一年,如下所示:

2022 年 12 月 21 日星期三 00:00:00 CST

2022 年 12 月 21 日星期三 00:00:00 CST

2022 年 12 月 21 日星期三 00:00:00 CST

//loop in another method
for (int i = realYear-1900; i <= realYear-1900+10; i++){
    date.setYear(i);
    vectorEvents.add(new Event(date, title));
}
textArea.setText(displayEvents());

//events method
public String displayEvents(){
    String data ="";
    Event e;
    for(int i=0; i<vectorEvents.size(); i++){
        e =  vectorEvents.get(i);
        data += e.date + "\n";
    }
    return data;
}

我尝试在添加第一个日期后显示,然后在添加第二个日期后再次显示。似乎将第一个日期更改为与第二个相同的最新年份。是否有另一种解决方案,或者只是有问题。谢谢你。

4

2 回答 2

2

您将相同的Date对象添加到向量中 10 次(顺便说一句,也不应该再使用它)。所以在循环结束时,向量中的每个引用都指向同一个 Date 对象,包含您在其上设置的最后一年。

您需要在每次迭代时实例化一个新的 Date :

for (int i = realYear-1900; i <= realYear-1900+10; i++){
    Date copy = new Date(date.getTime());
    copy.setYear(i);
    vectorEvents.add(new Event(copy, title));
}
于 2012-12-09T17:18:54.107 回答
1

Date对象在 Java 中是可变的,正如其他人指出的那样,您只使用一个实例并对其进行更改。

如果Event对象是您的,从长远来看,最好的解决方案是更改构造函数并创建Date传递的副本(按照 Bruce Eckel 在“Effective Java”中的术语制作防御性副本)。

public Event(Date d, String title) {
    this.date = new Date(d.getTime());
    this.title = title
}

请注意,您不需要对titlesince执行相同操作String是不可变的。

于 2012-12-09T17:24:41.490 回答