2012-12-14 47 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