2012-12-09 21 views
1

我仍在使用Java的過時的setYear()對我的日曆程序,並不知它顯示同年這樣的:添加重複日期爲載體

週三12月21日00:00:00 CST 2022

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

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

//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; 
} 

我嘗試添加的第一個日期,然後加入次後再次顯示之後顯示e秒。它似乎將第一次日期更改爲最後一年,與第二次日期相同。有沒有另一種解決方案,或者有什麼問題。謝謝。

+0

您僅限於JDK課程,還是可以使用joda時間? – bowmore

+1

看起來像您一直在更新相同的Date實例。把'new Date()'放到你的循環中。 – mazaneicha

回答

2

您正在向同一個向量添加相同的Date對象(不應再使用該對象,BTW)。因此,在循環結束時,向量中的每個引用都指向同一個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)); 
} 
+0

謝謝你我愛你的男人!試過,但我做了copy = date;感謝很多 – javaman

1

Date對象在Java中是可變的,因爲其他人指出您只使用一個實例,並改變它。

如果Event對象是你的,從長遠來看,最好的解決辦法是改變構造和(在「有效的Java」讓布魯斯Eckel的條款防禦副本)創建Date通過的副本。

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

注意到你怎麼不需要做同樣與title因爲String的是inmutable。

+0

+1的防禦副本。我傾向於考慮和使用Date作爲一個不可變對象(因爲它應該從一開始),假設每個人都這樣做,但似乎有些人繼續變異日期:-( –

+0

感謝人更好地記住 – javaman