2012-12-14 4 views
0

Bonjour, j'ai une application où je dessine des choses en cliquant sur la gauche de la souris, lors du déclenchement de la souris droite Il faut aller dans la ArrayList et créer un nouvel objet. et quand je commence à cliquer à nouveau sur la souris gauche, elle doit continuer avec le nouvel objet continuer à montrer l'autre objet. Mon problème est que l'ancien disparaît. quelqu'un peut-il regarder ce que j'ai oublié?mettre objet dans arraylist et créer un nouvel objet

ici est le code

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

J'ai oublié la boucle foreach dans mon paintComponent.

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

Je vois le problème avec 'addPoint()' ... pouvez-vous poster le code pour cette méthode? – Vikram

Répondre

0

Ces lignes:

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

Vous en train de détruire la référence au dessin "ancien" objet. Si vous voulez que les deux restent là-haut, vous devez créer un concept d'ancien et de nouveau dans votre application. Peut-être un Map<Drawing,List<Drawing>

0

Le problème est dans la méthode paintComponent(Graphics g). Dans celui-ci, vous ne retrouvez que l'objet draw actuel. Lorsque vous en complétez un avec le bouton droit de la souris et en initialisez un nouveau, il ne contient aucune information sur les objets précédents et donc rien n'est dessiné. Vous paintComponent(Graphics g) devrait ressembler à ceci:

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

Cette boucle sur toutes Drawings peinture chacun d'entre eux.

+0

N'est-ce pas plus efficace, de ne pas tout redessiner à chaque fois et de ne laisser que les anciens dessins, en ne manipulant que le «plus récent»? Imaginez un scénario avec 2 trillions de dessins. – Woot4Moo

+0

@ Woot4Moo Tout à fait d'accord. Je soulignais à peine pourquoi le comportement indésirable se produit, n'essayant pas d'écrire le code le plus efficace. Sur une autre note, vous allez probablement manquer de mémoire bien avant d'atteindre 2 trillions de dessins. –

+0

Bien sûr :), j'ai toujours le pire cas, il haha ​​ – Woot4Moo

Questions connexes