[java] 2 Problemes: Listener & Canvas

bonjour, je rencontre 2 problemes en java:

le premier est que je n’arrive pas à supprimer un listener avec la méthode removeListener.

Voici mon code:
graph est un Canvas
mouseListener est un écouteur de souris

graph.removeMouseListener(mouseListener);
System.out.println(graph.getMouseListeners());

Affichage apres éxecution du code

[Ljava.awt.event.MouseListener;@5e0602

Le second problème est moins important:

Sur mon Canvas, il m’arrive de faire du “drag and drop”, et évidemment à chaque déplacement de la souris, je fais un Repaint().
Mais à chaque repaint, des trames apparraissent et disparraissent aussitot sur mon Canvas, et le rendu est pas tres beau.

une idée pour supprimer cela?

Pouvez vous m’aider ?

Faudrait voir ton code :wink:
Si tu dessine et que tu surcharge la méthode paintComponent(Graphics g) appel tu super.paintComponent(g) au tout debut ? :neutre:

Genre ca:


class QuelClasse extends canvas
[...]
public void paintComponent(Graphics g)
    {
       super.paintComponent(g);      
                
       g.drawOval(x,y,12,12);
       g.fillOval(x,y,12,12); 
    }

je n’ai pas surcharger la méthode paintComponent, j ai pas trouvé dans le sdk, par contre j ai surchargé la méthode paint

le graphique dessine le jeu du solitaire en 2D et en vue de dessus.
le graphique observe l’instance plat de la classe Plateau ( à chaque changement de mon modèle, la vue change ).
le graphique permet un drag and drop d’une des boules, d’où les méthodes selectedBall et tout le tralala.
Etant donné que je fais appel à beaucoup de repaint() lors du drag and drop, j ai des trames qui apparraissent et c est normal, mais y a t il un moyen d’optimiser le rendu?

public class Graphique extends Canvas  implements Observer{
	public final Color DARK_BROWN=new Color(171,101,0);
	public final Color LIGHT_BROWN=new Color(223,166,84);
	public final Color DARK_BLUE=new Color(0,0,150);
	public final Color LIGHT_BLUE=new Color(0,0,200);
	
	private final int MARGIN=32;
	private final int CASE_SIZE=35;
	
	private Case selectedBall;
	private int deltaX;
	private int posX;
	private int deltaY;
	private int posY;
	private boolean clicked;
	private Plateau plat;
	
	public Graphique(Plateau plateau){
  plat=plateau;
  clicked=false;
  selectedBall=null;
  plat.addObserver(this);
	}
	
	public void selectedBall(Case c,int x, int y){
  if(c==null){
  	throw new IllegalArgumentException("argument is null");
  }
  selectedBall=c;
  deltaX=x-(c.getX()*CASE_SIZE+MARGIN);
  deltaY=y-(c.getY()*CASE_SIZE+MARGIN);
  posX=x-deltaX;
  posY=y-deltaY;
  clicked=true;
  repaint();
	}
	
	public void diselectedBall(){
  selectedBall=null;
  clicked=false;
  repaint();
	}
	
	public Case getSelectedBall(){
  return selectedBall;
	}
	
	public Case getCase(int x,int y){
  int tempX,tempY;
  tempX=(int) ((x-MARGIN)/(1.*CASE_SIZE));
  tempY=(int) ((y-MARGIN)/(1.*CASE_SIZE));
  if(tempX<0 || tempX>6 || tempY<0 || tempX>6 ){
  	return null;
  }
  if((tempX<2 || tempX>4) && (tempY<2 || tempY>4)){
  	return null;
  }
  return plat.getCase(tempX,tempY);
	}
	
	public void paint(Graphics g){
  super.paint(g);
  drawPlateau(g);
  drawBalls(g);
  g.dispose();
	}
	
	private void drawPlateau(Graphics g){
  g.setColor(Color.WHITE);
  g.fillRect(0,0,(int)this.getSize().getWidth(),(int)this.getSize().getHeight());
  g.setColor(DARK_BROWN);
  g.fillOval(15,15,270,270);
  g.setColor(LIGHT_BROWN);
  for(int i=0;i<7;i++){
  	for(int j=0;j<7;j++){	
    if( (i>=2 && i<=4) || ( j>=2 && j<=4 && (i<2 || i>4)) ){
    	g.fillOval(i*CASE_SIZE+MARGIN,j*CASE_SIZE+MARGIN,25,25);
    }
  	}
  }
	}
	
	private void drawBalls(Graphics g){
  g.setColor(DARK_BLUE);
  for(int i=0;i<7;i++){
  	for(int j=0;j<7;j++){
    if( (i>=2 && i<=4) || ( j>=2 && j<=4 && (i<2 || i>4)) ){
    	if(plat.getCase(i,j)!=null && !plat.getCase(i,j).isEmpty()){
      if(plat.getCase(i,j)==selectedBall && clicked==true ){
      	g.fillOval(posX,posY,25,25);
      } else {
      	g.fillOval(i*CASE_SIZE+MARGIN,j*CASE_SIZE+MARGIN,25,25);
      }
    	}
    }
  	}
  }
	}

	public void update(Observable arg0, Object arg1) {
  repaint();
	}

	public void changeCoordonnate(int x, int y) {
  if(clicked){
  	posX=x-deltaX;
  	posY=y-deltaY;
  	repaint();
  }
	}
}

je posterai ma classe Controller pour mon probleme de listener dans un autre post, celui-ci est déjà assez long.

vous pouvez le télécharger ici -> jeu du solitaire
il faut le jre 1.5

java -jar solitaire.jar

Pkoi dans paint(Graphics g) tu appel g.dispose(); ? si tu essayais sans?

j ai supprimé, ca me fait la meme chose.

c est bon, c est réparé.

J ai fait la grosse erreur d’utiliser un composant AWT parmi mes composants SWING.
En effet Canvas est un composant AWT.

J ai finalement fait hérité ma classe Graphique de JComponent. Dans Graphique j’ai surchargé la fameuse méthode paintComponent. Et la ca marche niquel.

Par contre j ai toujours mon problème avec mes removeListeners.

je poste ma classe:

package controller;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.Observable;
import java.util.Observer;
import model.Case;
import view.Fenetre;
import view.Graphique;


public class MouseController implements Observer{
	private Graphique graph;
	private Fenetre f;
	private MouseListener mouseListener;
	private MouseMotionListener mouseMotionListener;
	
	public MouseController(Fenetre fenetre, Graphique graphic){
  f=fenetre;
  graph=graphic;
  
  MouseListener mouseListener=new MyMouseListener();
  MouseMotionListener mouseMotionListener=new MyMouseMotionListener();
  
  graph.addMouseMotionListener(mouseMotionListener);
  graph.addMouseListener(mouseListener);
  
  f.getPlateau().addObserver(this);
	}

	public void update(Observable arg0, Object arg1) {
                /* normalement les 2 lignes ci dessous sont enfermés dans une condition et ne douvent s'exécuter que lors que le jeu est terminé ( jeu gagné , ou jeu bloqué ) */
  graph.removeMouseListener(mouseListener);
  graph.removeMouseMotionListener(mouseMotionListener);
  System.out.println("aa");
  if(arg0==f.getPlateau() ){
  }
  
	}
	
	class MyMouseListener extends MouseAdapter{
  public void mousePressed(MouseEvent e){
  	Case temp=graph.getCase(e.getX(),e.getY());
  	if(temp!=null && !temp.isEmpty() ){
    	graph.selectedBall(temp,e.getX(),e.getY());
  	}
  }
  public void mouseReleased(MouseEvent e){
  	Case temp=graph.getCase(e.getX(),e.getY());
  	
  	if(temp!=null && !temp.isEmpty() ){
    graph.selectedBall(temp,e.getX(),e.getY());
  	} else {
    graph.diselectedBall();
  	}
  }
	}
	class MyMouseMotionListener implements MouseMotionListener{
  public void mouseDragged(MouseEvent arg0) {
  	graph.changeCoordonnate(arg0.getX(),arg0.getY());
  }

  public void mouseMoved(MouseEvent arg0) {
  }
	}
	
}

le problème se situe dans update, quand je fais appel a removeListener…, elle n’a aucun effet , pourtant ces fonctions s’exécutent bien.

Et la je sais pas du tout pourquoi ca veut pas marché ???

Par contre, j ai essayé de déplacer ces méthodes dans une méthode a part, ca marche pas. Mais si je fais appels à ces méthodes dans le contructeur, ca marche ???

Une idée ? Je sais que là c est pas franchement évident

Mais pourquoi tu veux lenlever le listener?

c’est bon, j ai contourné le problème.

Je voulais enlever le listener pour la raison suivante:
Lorsqu’une partie est en cours le joueur peut déplacer les billes, Mais lorsque la configuration du jeu est considéré comme fini ( gagné ou bloqué ). J’enlève le listener de la souris

voila.