Pb JAPPLET avec JScrollPane

BRUNO1985 Messages postés 7 Date d'inscription dimanche 15 août 2004 Statut Membre Dernière intervention 4 juillet 2009 - 6 juin 2009 à 15:55
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 8 juin 2009 à 06:43
Bonjour,

La partie du code d'une applet que j'ai réaliser permet de pointer des zones d'une image. Le principe est simple en faite j'ai une image (ImageIcon) sur laquelle je dessine des carré rouge permettant de pointé une zone de l'image.

Sauf que le probléme c'est que dés que je deplace le Jscrollpan l'image ne s'actualise pas et tout devient blanc ...

Voici ma classe Point :
package fr.test.applet;

public class Point {
    
    private float[][] polygone = new float[100][2];
    
    private int NbPoints=0;

    public    Point() {
    }

    public float[][] getPolygone() {
        return polygone;
    }

    public int getNbPoints() {
        return NbPoints;
    }

    public void AjouterPoint(int x,int y) {
        polygone[NbPoints][0]=x;
        polygone[NbPoints][1]=y;
        NbPoints++;

    }

    public void SupprimerPoint(int NumPoint) {
        for (int compte=NumPoint;compte<NbPoints;compte++) {
            polygone[compte][0]=polygone[compte+1][0];
            polygone[compte][1]=polygone[compte+1][1];
        }
        NbPoints--;        
    }

    public int TrouverPoint(int pointeurX,int pointeurY) {    
        int numPoint=-1;
        int compte=0;
        while ((numPoint==-1)&amp;(compte<NbPoints)) {
            if (((polygone[compte][0]-pointeurX)<6) &amp; ((polygone[compte][0]-pointeurX)>-6))
                if (((polygone[compte][1]-pointeurY)<6) &amp; ((polygone[compte][1]-pointeurY)>-6))
                    numPoint=compte;
            compte++;
        }
        return numPoint;
    }

}


Et ma JApplet :
package fr.test.applet;
import    java.awt.*;

import fr.test.applet.Point;

import java.awt.event.*;

import javax.swing.ImageIcon;
import javax.swing.JApplet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;

public class test extends JApplet  implements ActionListener, MouseListener ,MouseMotionListener { 

    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    int maxX;
    int maxY;
    int PointAdeplacer;
    boolean DeplacementEffectue;
    boolean PointInsere=false;

    Point ensemblePoints = new Point();

    
    JButton SupprimerPoint = new JButton ("Supprimer");
    JButton insererPoint = new JButton ("Ins?rer un point");

    JLabel PositionSouris=new JLabel ("Position curseur: ",Label.LEFT);
    JTextField coordonneesSouris=new JTextField(" ",10);
    JLabel etatLabel=new JLabel ("Historique des actions :",Label.LEFT);
    List etat=new List();

    int width = 200;
    int height = 200;
    
    private JPanel pan;
    private JScrollPane pandefil;
    private Container contenu;
    
    
    private Image backbuffer;
    private Graphics backg;
    String pointTmp = "";

    
    int x;
    int y;
    ImageIcon img;
    
    public void init() {

        
        
        System.out.println(getCodeBase());
        img=new ImageIcon("IMAGE.GIF");
        setSize(1000, 750);
        contenu = getContentPane();
        pan = new JPanel();
        Dimension d = new Dimension(img.getIconWidth(), img.getIconHeight());
        
        pan.setBackground(Color.WHITE);
        pan.setPreferredSize(d);
        System.out.println(d.width + ", " + d.height);

        pandefil = new JScrollPane(pan); 
        
        
        maxX =img.getIconWidth();
        maxY = img.getIconHeight();
        pandefil.setAutoscrolls(true);
        pandefil.addMouseMotionListener(this);
        
        pandefil.addMouseListener(this);
        
        
    

        
        SupprimerPoint.addActionListener(this);
        pandefil.setViewportView(pan);
        contenu.add(pandefil, "Center");
        backbuffer = createImage(d.width, d.height);
        backg = backbuffer.getGraphics();
        backg.setColor( Color.white );
        
        affichageMarqueur();
        System.out.println(pandefil.getAutoscrolls() + ", Hauteur : " + pan.getHeight()+ ", Hauteur : " + pan.getWidth());
        
        }

    //Lorsqu'on clique
    public void mouseClicked (MouseEvent evt) {
        x = evt.getX();
        y = evt.getY();
        PointAdeplacer=ensemblePoints.TrouverPoint(x,maxY-y);
    
        if (x> maxX || y > maxY) 
            System.out.println("Point hors de la surface dessinable");
        
        else {
            if (PointAdeplacer==-1){
                JOptionPane.showInputDialog(null, "Saisissez un nom");

            ensemblePoints.AjouterPoint(x,maxY-y);
            }
            if (PointAdeplacer!=-1){
                DeplacementEffectue=false;
            }
        System.out.println("x :"+x+" y :"+y);
        affichageMarqueur();
        repaint();
        }
    }

    //Gestion des ?venements : lorsqu'on appuit sur un bouton
    public void actionPerformed(ActionEvent event) {
        String command = event.getActionCommand();
    
        if (command == "Supprimer") { 
            if (PointAdeplacer!=-1)    {
                ensemblePoints.SupprimerPoint(PointAdeplacer);
                PointAdeplacer=-1;
            }
            affichageMarqueur();
            repaint();
        }
    }

    public void affichageMarqueur() {
        backg.drawImage(img.getImage(),0,0,this);
        //Le bouton supprimer est activer uniquement
        //si un marqueur a ete selectionner
        if(pointTmp != null) {
            if (pointTmp.compareTo("")!=0)
                SupprimerPoint.setEnabled(true);
            else 
                SupprimerPoint.setEnabled(false);
        } else {
            pointTmp = "";
            SupprimerPoint.setEnabled(false);
        }

        //Affichage des differents marqueurs
        int compte;
        int x1;
        int y1;

        backg.setColor(Color.red); 
        
        for (compte=0;compte<(ensemblePoints.getNbPoints());compte++)  {
            x1=(int) (ensemblePoints.getPolygone()[compte][0]);
            y1=maxY - (int) (ensemblePoints.getPolygone()[compte][1]);
            if (compte==PointAdeplacer) {
                backg.fillRect(x1-4,y1-4,8,8);
            }
            backg.drawRect(x1-4,y1-4,8,8);    
        }    
    }
    
    
    public void update(Graphics g) {
        g.drawImage(backbuffer,0,0,this);
    }

    public void paint(Graphics g) {
        super.paint(g);
        update(g);    
    }

    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub
        
    }

    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub
        
    }
    

    public void mouseDragged (MouseEvent evt) {    
        // TODO Auto-generated method stub
    }
    

    public void mouseReleased (MouseEvent evt) {
        // TODO Auto-generated method stub
    }
    

}



Merci d'avance pour votre précieuse aide

7 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
6 juin 2009 à 16:09
Salut,

Redéfinit la méthode paintComponant et utilise la pour retrace ton applet en lieu et place de la méthode update.
BRUNO1985 Messages postés 7 Date d'inscription dimanche 15 août 2004 Statut Membre Dernière intervention 4 juillet 2009
6 juin 2009 à 16:28
Merci de ta réponse, j'ai donc simplement remplacer le méthode

    public void paint(Graphics g) {
        super.paint(g);
        update(g);    
    }

par

    protected void paintComponant(Graphics g) {
        super.paintComponant(g);
        update(g);   
    }

Mais cela m'affiche plus rien maintenant ...
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
6 juin 2009 à 18:03
Autant pour moi, ce n'est pas paintComponAnt mais paintComponEnt
BRUNO1985 Messages postés 7 Date d'inscription dimanche 15 août 2004 Statut Membre Dernière intervention 4 juillet 2009
6 juin 2009 à 20:09
Même en redéfinissant paintComponent cela donne rien , un JscollPan Blanc ... Par contre un deuxième problème que je viens de remarquer. Admettons que mon image fasse 1516x2286 en plus de ne pas pouvoir me deplacer tout en actualisant l'image, quand je me deplace avec les scrollbars dans le coin inferieur droit de l'image, si je clique pour pointer cette zone, mon marqueur (qui est un carré rouge), va se positionner en 910, 850 au lieu de 1516x2286. Si tu peu executer l'applet en mettant une image de grande taille tu constatera le probléme ... Merci de ton aide car là je suis un peu désemparé...

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BRUNO1985 Messages postés 7 Date d'inscription dimanche 15 août 2004 Statut Membre Dernière intervention 4 juillet 2009
7 juin 2009 à 16:31
Concernant le problème de positionnement des marqueurs cela est resolus il suffit simplement de prendre en compte la position relative du JScrollPan avec les méthode suivante :

pandefil.getHorizontalScrollBar().getValue();
pandefil.getVerticalScrollBar().getValue();

Par contre en redéfinissant paintComponent de la manière suivante :
   
public void paintCompenent(Graphics g) {
        super.paintComponents(g);
       
        update(g);   
    }

J'ai bien mes ScrollBars qui s'affiche en fonction de la taille de mon image mais le JPanel reste blanc ...

Quelqu'un aurait une idée ?
BRUNO1985 Messages postés 7 Date d'inscription dimanche 15 août 2004 Statut Membre Dernière intervention 4 juillet 2009
7 juin 2009 à 21:50
Quelqu'un à une idée ??
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 131
8 juin 2009 à 06:43
ah mais oui : tu as redéfinit le paintComponent du JApplet et non du panel !

C'est le panel qu'il faut retracer, pas le JApplet, donc il faut redéfinir le paintComponent du JPanel.
Rejoignez-nous