2012-12-01 47 views
0

我經歷了一個小程序,並且遇到了一個錯誤,我無法找到解決方案。將創建的對象添加到列表中時遇到問題

我的目標是通過觸發一個點擊來創建一個創建的對象(從JPanel擴展的BlockObject)列表(使用ArrayList),然後能夠讀取列表以在屏幕上打印它,但是當時閱讀這樣的列表我得到ArrayOutOfBoundsException。

我一直在調試,發現麻煩的原因,這就是我不知道爲什麼,我創建並添加到它的每個對象檢索最新類型(前面解釋),而不是與哪個它被創造了。

沿列表運行的代碼是

public void ListBlock(){ 

    BlockObject auxb; 
    Point auxp; 

    for(int i = 0; i < list.size(); i++){ 
     auxb = list.get(i); 

     if(auxb.getType() != 0){ 

      auxp = list.get(i).limitBounds(0, list.get(i - 1).getHeight()); 
      auxb.setBounds((int) auxp.getX(), (int) auxp.getY(), GlobalDataStorage.StatementWidth, GlobalDataStorage.StatementHeight); 
     } 
     add(auxb); 
    } 

} 

麻煩的說,這是因爲它在IF()條件總是得到,因此,即使第一個元素將前一個(爲OutOfBounds的原因),但已經有內部在每一時刻的元素這將是類型0到跳吧,剩下的在裏面輸入:

list = new ArrayList<BlockObject>(); 
    startingBlock = new BlockObject(0); 

類型有0,但它更改爲提前解釋,那是什麼不應該發生,不知道它爲什麼會這樣。

以下元素加入:

public void mouseClicked(MouseEvent evt) { 

     point = new Point(evt.getX(), evt.getY());; 

     if((findComponentAt(point) instanceof BlockObject) && (StatementPanel.getType() != 0)){ 

      list.add(new BlockObject(StatementPanel.getType())); 

      ListBlock(); 
      revalidate(); 
      repaint(); 

     } 

    } 

類型在BlockObject創建它保存在一個變量,它應該不會改變,所以每次創作我認爲這會被保存在一個列表值,但它不斷更改在StatementPanel中選擇的新葉(StatementPanel在JTree後實現,每個葉不同類型)時創建的所有先前對象。 雖然也許這是獲得類型的靜態方法,但沒有添加不同的工作。

也許問題很明顯,我看不到它。

+2

學習如何使用調試器,然後您可以自己調查這類錯誤,並且所花費的時間遠遠少於編寫此問題的時間。 http://www.vogella.com/articles/EclipseDebugging/article.html –

+1

聽起來像一個靜態變量問題 – MadProgrammer

+0

@MadProgrammer看到你的評論後,我檢查了變量,這是問題,保持一個靜態,離開它彷彿是正常的。沒想到會給我帶來這樣的麻煩。感謝您的幫助以及所有回覆帖子提示的人。 – user1869292

回答

1

我假設你有這樣的問題:

Example e = new Example(); 
e.ChangeValue("e"); 
List<Example> examples = new List<Example>(); 
examples.add(e); 
e.ChangeValue("e2"); 
examples.add(e); 

與此問題是,如果你加測e到列表中它只是創建對象並都添加到列表都指向同一個參考參考(所以改變一個也會改變另一個),對此的解決方案將創建一個新的對象一個新的例子,並將它的值複製到它,這樣你就不會有參考問題,並且可以一次只更改一個

相關問題