2012-12-14 49 views
0

你好我有一個應用程序,我在繪製東西時點擊鼠標左鍵,當觸發右鍵時它需要進入ArrayList並創建一個新的對象。當我再次開始點擊鼠標時,它必須繼續保持新的對象不斷顯示另一個對象..我的問題是,舊的消失。任何人都可以看看我忘了什麼?把對象放在arraylist中,並創建新的對象

這裏是代碼

Drawing draw; // class definition 
private ArrayList<Drawing> tekening = new ArrayList<Drawing>(); 

public DrawingPanel() { 
    setBackground(Color.WHITE); // zorg voor een witte achtergrond. 
    this.addMouseListener(this); // control de mouselistener 
    draw = new Drawing(color); 
} 

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    draw.draw(g); 
    repaint(); 
} 

@Override 
public void mouseClicked(MouseEvent e) { 

    if(e.getButton() == MouseEvent.BUTTON1) { 
     Point k = new Point(e.getX(), e.getY()); 
     draw.addPoint(k); 
     System.out.println("punt gezet op " + k); 
    } 
    if(e.getButton() == MouseEvent.BUTTON3) { 
     tekening.add(draw); 
     color = new Color(r.nextInt(255 - 0 + 1) + 0, r.nextInt(255 - 0 + 1) + 0, r.nextInt(255 - 0 + 1) + 0); 
     //System.out.println("new color " + color); 
     draw.setColor(color); 
     draw = new Drawing(color); 
    } 
} 

我忘了在我的paintComponent foreach循環。

 for(Drawing draw : tekening) { 
     draw.draw(g); 
    } 
+0

我看到'addPoint()'的問題......你能發佈這個方法的代碼嗎? – Vikram

回答

0

這些行:

draw.setColor(color); 
draw = new Drawing(color); 

你正在破壞參照 「老」 圖形對象。如果你希望兩者都保持在那裏,你需要在應用程序中創建一些新舊概念。也許一個Map<Drawing,List<Drawing>

0

問題是在paintComponent(Graphics g)方法。其中,您只重繪當前的draw對象。當你用鼠標右鍵完成並初始化一個新的對象時,它不包含以前對象的任何信息,因此不會繪製任何信息。你paintComponent(Graphics g)應該是這樣的:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    for(Drawing dr : tekening) { 
     dr.draw(g); 
    } 
    repaint(); 
} 

這遍歷所有Drawings畫他們中的每一個。

+0

它不是更有效率,每次都不重繪所有內容,只留下舊的圖紙,而只操作「最新」的圖紙?想象一下有2萬億圖紙的場景。 – Woot4Moo

+0

@ Woot4Moo絕對同意。我幾乎沒有指出爲什麼發生不良行爲,而不是試圖編寫最有效的代碼。另一方面,在您達到2萬億圖紙之前,您很可能會耗盡內存。 –

+0

當然:),我總是最壞的情況下,它haha – Woot4Moo