Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'affichage d'applet

    4 avril 2009 à 13:38:15

    Bonjour,

    Hier soir je me suis heurté à un petit problème, que j'ai du mal à comprendre.Je viens donc vous demander de l'aide :).

    Donc, après avoir lu le tuto sur le langage java, dans la partie applet, j'ai voulu en faire de meme. Donc j'ai crée mon .class et mon .html. Jusque là tout va bien, quand je lance la page html avec la console (je suis sous ubuntu) tout fonctionne niquel ! "Mais où est le problème ?" allez-vous me demander :p

    Ben le problème c'est que quand je lance la même page, mais par double clique (la page qui est au même endroit), à ce moment là, l'affichage fait n'importe quoi et je me retrouve avec une "case" toute grise. Quand je déplace le curseur dessus, les boutons s'affichent quand le curseur les découvre, et le label s'affiche quand j'appuie sur un des boutons. Par contre l'affichage du JPanel (avec la boule qui rebondit) ne s'affiche pas.

    D'où cela provient-t-il et comment puis-je remédier à ce problème ?

    Merci pour votre aide !
    • Partager sur Facebook
    • Partager sur Twitter
      4 avril 2009 à 16:08:48

      L'affichage de la boule qui rebondit ? Très mauvaise idée de mettre l'animation du tuto dans un applet étant donné qu'elle comporte plein d'incohérences et de maladresses ^^ (certes tu ne pouvais pas deviner)
      Autant pour faire fonctionner le programme sur ton PC je saurais le corriger tout de suite mais là dans un applet comme j'en ai très peu réalisés je ne sais même plus comment ça marche ^^
      Pourrais-tu poster le code de l'applet ? Je pourrais te dire là où ça bloque (les problèmes d'affichage sont soit dus aux threads mal utilisés, soit à une cafouille au niveau des paintComponent, en gros).
      • Partager sur Facebook
      • Partager sur Twitter
        4 avril 2009 à 16:39:08

        Voici le code (recopié du tutoriel)

        import java.awt.BorderLayout;
        import java.awt.Color;
        import java.awt.Font;
        import java.awt.event.ActionEvent;
        import java.awt.event.ActionListener;
         
        import javax.swing.JFrame;
        import javax.swing.JLabel;
        import javax.swing.JPanel;
        import javax.swing.JButton;
        import javax.pplet.Applet;
         
        public class Fenetre extends Applet{
         
            private Panneau pan = new Panneau();
            private JButton bouton = new JButton("Start");
            private JButton bouton2 = new JButton("Stop");
            //private JPanel container = new JPanel();
            private JLabel label = new JLabel("Le JLabel");
            private boolean animated = true;
            private boolean backX = false;
                //Le booléen pour savoir si on recule ou non sur l'axe Y
            private boolean backY = false;
            /**
             * Compteur de clics !
             */
            private int compteur = 0;
            private Thread t;
            public void init(){
                   
        	//this.setTitle("Animation");
        	this.setSize(300, 300);
        	// this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        	//this.setLocationRelativeTo(null);
         
        	//this.setBackground(Color.white);
        	//this.setLayout(new BorderLayout());
        	this.getContentPane().add(pan, BorderLayout.CENTER);
                    
        	//On ajoute notre Fenetre à la liste des auditeurs de notre Bouton
        	Panneau pan2= new Panneau();
        
        	bouton.addActionListener(new BoutonListener());
        	bouton.setEnabled(false);
        	bouton2.addActionListener(new Bouton2Listener());
                    
        	pan2.add(bouton, BorderLayout.WEST);
        	pan2.add(bouton2, BorderLayout.EAST);
                    
        	this.getContentPane().add(pan2, BorderLayout.SOUTH);
        	//Définition d'une police d'écriture
        	Font police = new Font("Tahoma", Font.BOLD, 16 );
        	//On applique celle-ci aux JLabel
        	label.setFont(police);
        	//On change la couleur de police
        	label.setForeground(Color.blue);
        	//Et on change l'alignement du texte grâce aux attributs static de la classe JLabel
        	label.setHorizontalAlignment(JLabel.CENTER);
                    
        	this.getContentPane().add(label, BorderLayout.NORTH);
                   
        	//this.getContentPane().add(container);
        	//this.setVisible(true);
        	t = new Thread(new PlayAnimation());
        	t.start();
        
                    
            }
                
            private void go(){
                
                //Les coordonnées de départ de notre rond
                int x = pan.getPosX(), y = pan.getPosY();
                //Le booléen pour savoir si on recule ou non sur l'axe X
                
               
                //Pour cet exemple, j'utilise une boucle while
                //Vous verrez qu'elle fonctionne très bien
                while(this.animated){
                       
        	    //Si la coordonnée x est inférieure à 1, on avance
        	    if(x < 1)backX = false;
        	    //Si la coordonnée x est supérieure à la taille du Panneau
        	    //moins la taille du rond on avance
        	    if(x > pan.getWidth()-50)backX = true;
                       
        	    //idem pour l'axe Y
        	    if(y < 1)backY = false;
        	    if(y > pan.getHeight()-50)backY = true;
                       
        	    //Si on avance, on incrémente la coordonnée
        	    if(!backX)
        		pan.setPosX(++x);
        	    //Sinon on décrémente
        	    else
        		pan.setPosX(--x);
                       
        	    //Idem pour l'axe Y
        	    if(!backY)
        		pan.setPosY(++y);
        	    else
        		pan.setPosY(--y);
                               
        	    //On redessine notre Panneau
        	    pan.repaint();
                       
        	    //Comme on dit : la pause s'impose ! Ici, 3 centièmes de secondes
        	    try {
        		Thread.sleep(3);
        	    } catch (InterruptedException e) {
        		// TODO Auto-generated catch block
        		e.printStackTrace();
        	    }
                }
               
            }
         
            //*******************************************************************************
            //                             LA VOILAAAAAAAAAAAAAA
            //*******************************************************************************
            /**
             * C'est la méthode qui sera appelée lors d'un clic sur notre bouton
             */
            class BoutonListener implements ActionListener {
        	public void actionPerformed(ActionEvent arg0){
        	    label.setText("Bouge petit rond ! bouge!!!");
        	    animated=true;
        	    bouton.setEnabled(false);
        	    bouton2.setEnabled(true);
        	    t = new Thread(new PlayAnimation());
        	    t.start();
        	    
        	}
        
            }
        
        
            class Bouton2Listener implements ActionListener {
        	public void actionPerformed(ActionEvent arg0){
        	    label.setText("1 2 3 SOLEIL !");
        	    animated=false;
        	    bouton.setEnabled(true);
        	    bouton2.setEnabled(false);
        	    
        	}
        
            }
           
            class PlayAnimation implements Runnable{
        	@Override
        	    public void run(){
        	    go();
        	}
            }
                
                
        }
        


        et la classe Panneau.java :
        import java.awt.BasicStroke;
        import java.awt.Color;
        import java.awt.Graphics;
        import javax.swing.JPanel;
         import java.awt.Image;
        import java.awt.image.*;
        
        import java.awt.Font;
        import java.awt.*;
        import java.io.File;
        import java.io.IOException;
        import javax.imageio.ImageIO;
        public class Panneau extends JPanel {
         
                private int posX = -50;
                private int posY = -50;
                
                public void paintComponent(Graphics g){
                        //On décide d'une couleur de fond pour notre rectangle
        	    Image img=null;
        	    try {
        		img = ImageIO.read(new File("fondBouton.png"));
        	
        		g.drawImage(img,0,0,this.getWidth(),this.getHeight(),this);
        	   
        	    
        	}catch(IOException e){
        	    System.out.println("Bug!");
        	}
        	    g.setColor(Color.black);
        	    //On dessine celui-ci afin qu'il prenne tout la surface
        	    //g.fillRect(0, 0, this.getWidth(), this.getHeight());
        	    //On redéfinit une couleur pour notre rond
        	    g.setColor(Color.red);
        	    //On le dessine aux coordonnées souhaitées
        	    g.fillOval(posX, posY, 50, 50);         
                }
            
                public int getPosX() {
                        return posX;
                }
         
                public void setPosX(int posX) {
                        this.posX = posX;
                }
         
                public int getPosY() {
                        return posY;
                }
         
                public void setPosY(int posY) {
                        this.posY = posY;
                }
                
        
        }
        


        Et la page html comporte le code normal <applet ...></applet>

        Au final le JPanel ne s'affiche pas du tout. Serait-ce une incompatibilité entre les applet et la bibliothèque swing ?

        La seule façon pour moi d'afficher quelque chose à l'écran c'est en utilisant la classe Applet et non JApplet et en utilisant directement la méthode paint() au lieu de passer par une JPanel.
        Voici un code qui marche :
        import java.awt.*;
        import java.net.*;
        import java.util.*;
        import java.applet.Applet;
        import java.applet.AudioClip;
        import java.io.File;
        import java.io.IOException;
        import javax.imageio.ImageIO;
        
        public class Test extends Applet{
            public void init(){
        	setSize(300,300);
        	
            }
        
             public void paint(Graphics g){
        	Image img = null;
        	try{
        	    img = getImage(new URL("file:///home/paul/projet_perso_java/test_applet/fondBouton.png"));
        	}catch (MalformedURLException e){}
        	g.drawImage(img,0,0,this.getWidth(),this.getHeight(),this);
        	    
        	
        	
        	g.setColor(Color.blue);
        	g.fillOval(25,25,75,75);
            }
        }
        


        Moi qui voulait mettre un jeu en ligne grâce à un applet, je me sens un peu embêté si je dois tout reprendre :-/

        Merci pour l'aide,
        Cordialement,
        • Partager sur Facebook
        • Partager sur Twitter
          4 avril 2009 à 18:04:27

          Rah lala y'a un gros problème de thread là. C'est vraiment trop dur à corriger comme code...
          Je te conseillerais bien de tout refaire toi même mais bon.
          J'essaierais bien de te faire un truc qui fonctionne mais j'ai pas vraiment le temps de relire le fonctionnement des Applets en détail.
          Je te laisse le lien au cas où : http://java.sun.com/docs/books/tutoria [...] et/index.html

          Je vais essayer deux trois trucs sur ton code, si ça ne marche pas je laisserai tomber.
          • Partager sur Facebook
          • Partager sur Twitter
            4 avril 2009 à 18:16:25

            Merci pour le lien, je vais regarder ça.

            Par contre, j'ai toujours pas compris pourquoi l'applet s'affiche si la page firefox est exécutée depuis ma commande de console et pas en faisant des clics dessus. De plus, le appletviewer m'affiche tout correctement sans message d'erreur aussi o_O .
            C'est à ce niveau là que les threads empêchent un affichage sur page web?

            Merci infiniment pour ton aide !

            • Partager sur Facebook
            • Partager sur Twitter
              4 avril 2009 à 18:37:18

              Alors là je n'en sais rien du tout ^^

              Si je dis que c'est un problème de thread, c'est parce que chez moi, je lance l'applet dans mon navigateur, et là je ne vois rien à l'écran tant que je ne clique pas sur un bouton (qui est invisible jusqu'à temps que j'appuie dessus d'ailleurs).
              Ce genre de problème vient très souvent des threads. En effet Swing utilise un thread pour gérer ses composants, puis il y a le main normalement, mais comme c'est un applet, je suppose que y'a un nouveau thread créé par le navigateur qui lance la méthode init().

              Il faut bien lire le tuto de Sun pour tout ça mais là j'avoue que je n'ai pas le temps.

              Bon courage et désolé de ne pas pouvoir faire plus ^^'
              • Partager sur Facebook
              • Partager sur Twitter

              Problème d'affichage d'applet

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown