IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Applets Java Discussion :

Réalisation d'une applet de supervision graphique


Sujet :

Applets Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Par défaut Réalisation d'une applet de supervision graphique
    Bonjour !

    Je suis en train de modifier une applet de supervision pour lui ajouter une fonctionnalité de supervision graphique.
    Dans une autre appli (écrite sous C++ Builder), je viens créer des dessins et déposer des objets qui s'animent selon l'état de l'automate industriel supervisé. Tout le paramétrage de ces dessins est contenu dans cet automate.

    D'un autre côté, cet automate dispose d'un serveur web embarqué basique, me permettant de lancer une applet Java. Dans cet applet, j'aimerai retrouver cette supervision graphique.

    Voici comment j'aimerai procéder : j'ai un javax.swing.JPanel, dans lequel j'aimerais créer des petits JPanel placés aux bons endroits (et avec la taille correcte) dans lesquels je viendrais dessiner mes petits icônes animés.
    A l'heure actuelle, j'arrive à créer mes JPanels, qui se retrouvent aux bons endroits et avec la bonne taille, mais impossible de dessiner dedans...

    Voici deux petits bouts de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    // code du JPanel contenant ma zone de dessin
    public class Onglet_dessins implements ItemListener {
    [...]
    	public void ActualiserIcones(int type){		
    		for(int i=0; i<numero[ecran_en_cours][type]; i++){
    			JPanel temp = new JPanel();
    			temp.setBounds(objets[ecran_en_cours][type][i].getBounds((float)2.0));
    			temp.setBackground(Color.white);
    			//objets[ecran_en_cours][type][i].getDessin(temp.getGraphics(), (float)2.0);
    			temp.repaint();
    			pnl_Dessins_ZoneDessin.add(temp);
    		}
    		pnl_Dessins_ZoneDessin.repaint();
    	}
    [...]
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // Code de ma classe "Dessins" (dont objets[][][] est une instance ci-dessus)
     
    public class Dessins{
    	public void getDessin(Graphics g, float zoom){
    		switch(this.type){
    			case TYPE_RECTANGLE:
    				this.getDessinRectangle(g, zoom);
    			[...]
    		}
    	}
     
    	private void getDessinRectangle(Graphics g, float zoom){
    	        g.setColor(Color.white);
    		g.fillRect(0, 0, (int)((X2-X1)*zoom), (int)((Y2-Y1)*zoom));
     
    		if(this.logique==0){
    			g.setColor(Color.black);
    		}else if((this.value&AFF_SEUIL)==AFF_SEUIL){
    			g.setColor(Color.red);			
    		}else{
    			g.setColor(Color.green);
    		}
    		g.drawRect(0, 0, (int)((X2-X1)*zoom), (int)((Y2-Y1)*zoom));
    	}
    }
    Problème : temp.getGraphics() me retourne null (et donc une erreur lorsque je fait g.setColor() ...)

    D'où vient mon erreur ?

    Merci d'avance pour vos réponses !

    Cordialement,
    Ch'Portos.

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 31
    Par défaut
    Bonjour,
    Bon déja je te rassure, tu n'as fait aucune erreur, mais un obbli.
    En effet on ne peux pas dessiner directement dans un JPanel, il va te falloir mettre dans ton JPanel un composant dans lequel tu dessine.
    En Java il existe bien la classe Canvas, mais pas top, car AWT, et mellanger Swing et AWT, faut mieux éviter.
    Je te propose plutôt d'utiliser la classe suivante basé sur un BufferedImage sur lequel le dessin est efectué en réalité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.image.BufferedImage;
     
    import javax.swing.JComponent;
     
    /**
     * Component for paint what you want
     */
    public class JComponentForPaint
    		extends JComponent
    {
    	/** Where the paint does */
    	private BufferedImage bufferedImage;
    	/** Graphics for paint */
    	private Graphics2D graphics2D;
    	/**
             * Constructs the component
             * @param width
             *        Width
             * @param height
             *        Height
             */
    	public JComponentForPaint(int width, int height)
    	{
    		Dimension dimension;
    		//
    		// Initialize the draw area
    		this.bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
    		this.graphics2D = this.bufferedImage.createGraphics();
    		//
    		// Initialize the dimension. For help layouts to put right dimension
    		dimension = new Dimension(width, height);
    		this.setSize(dimension);
    		this.setPreferredSize(dimension);
    		this.setMaximumSize(dimension);
    		this.setMinimumSize(dimension);
    		//
    		dimension = null;
    	}
    	/**
             * Obtain the graphics for paint
             * @return Graphics for paint
             */
    	public Graphics2D obtainGraphics2D()
    	{
    		return this.graphics2D;
    	}
    	/**
             * Draw the last change
             */
    	public void flush()
    	{
    		this.bufferedImage.flush();
    		this.repaint();
    	}
    	/**
             * Call it to free the memory for help the garbage collector<br>
             * Don't use the instance after call it
             */
    	public void detroyAll()
    	{
    		this.bufferedImage.flush();
    		this.bufferedImage = null;
    		this.graphics2D.dispose();
    		this.graphics2D = null;
    	}
    	/**
             * Paint the component
             * @param g
             *        Graphics environment
             * @see javax.swing.JComponent#paintComponent(java.awt.Graphics)
             */
    	protected void paintComponent(Graphics g)
    	{
    		if(this.bufferedImage != null)
    		{
    			g.drawImage(this.bufferedImage, (this.getWidth() - this.bufferedImage.getWidth()) / 2,
    					(this.getHeight() - this.bufferedImage.getHeight()) / 2, null);
    		}
    	}
    }
    Pour dessiner dessus prend le Graphics donner par la méthode obtainGraphics2D(). N'oublie pas une fois ton dessin effectuer de mettre à jour le composant via la méthode flush qui va mettre à jour l'affichage

    JackHack

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Par défaut
    Merci JackHack pour ta réponse précise !

    J'ai cependant encore quelques petits "détails" à te demander :
    - Comment je fais ensuite dans ma classe principale "Onglets_Dessins" ? Puis-je encore faire des add à mon JPanel (celui définissant ma "zone de dessin") ?
    - Je suis censé faire plusieurs écrans de dessins : un moyen de sélection (je pense notamment à un JTabbedPane) me permet de choisir un écran, et d'afficher mes petits objets correspondant à chaque écran : comment puis-je alors supprimer les objets dessinés dans le JPanel de zone de dessin avant d'ajouter les nouveaux ?

    Merci encore pour ce que tu m'as déjà donné, et merci d'avance pour les infos que tu pourras me donner

    Cordialement,
    Ch'Portos.

  4. #4
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    J'avais fait une applet similaire pour le pilotage de souffleuses PET (bouteille plastique). L'intégralité de l'applet n'était qu'une seule BufferedImage. Un Thread global gérait les animations des différentes images provenant du serveur Web de la machine. Des images prédéfinies permettaient de faire un peu de décoration.
    J'avais trouvé plus facile et plus efficace de gérer un BufferedImage avec coordonnées X et Y plutôt que pleins de Panel.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Par défaut
    Bonjour,

    J'avais déjà réfléchi à cette solution, mais je dois pouvoir faire des actions en cliquant (gauche ou droit) ou en bougeant la souris dessus, donc "jouer" avec une BufferedImage deviendrait difficile (comment détecter que là où on a cliqué il y a qqch et quoi ?)
    D'où l'utilisation de JPanels

    Merci pour l'idée !
    Ch'Portos.

  6. #6
    Modérateur
    Avatar de dinobogan
    Homme Profil pro
    ingénieur
    Inscrit en
    Juin 2007
    Messages
    4 073
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 4 073
    Par défaut
    Citation Envoyé par ChPortos Voir le message
    Bonjour,

    J'avais déjà réfléchi à cette solution, mais je dois pouvoir faire des actions en cliquant (gauche ou droit) ou en bougeant la souris dessus, donc "jouer" avec une BufferedImage deviendrait difficile (comment détecter que là où on a cliqué il y a qqch et quoi ?)
    D'où l'utilisation de JPanels

    Merci pour l'idée !
    Ch'Portos.
    Il y avait également des interactions avec la souris !
    Mais si tu te sens plus à l'aise avec les Panel, alors garde ta solution. Tu perdras moins de temps
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java
    Que la force de la puissance soit avec le courage de ta sagesse.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Par défaut
    Merci JackHack !!!

    J'ai implémenté ta solution, et elle marche (presque) nickel !

    Je dit "presque" parce que j'ai toujours un petit problème lors du changement d'écran de supervision : certains JComponentForPaint restent sur la zone de dessin alors qu'ils devraient se faire supprimer

    Je vais vérifier que je supprime bien TOUT les composants (vérification des boucles de suppression), et je vous tiens au courant

    Encore merci !
    Ch'Portos.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Par défaut
    Bonjour !

    La solution de JackHack fonctionne à merveille (mis à part mon problème de suppression) si ce n'est que quand je rafraichis mes icônes (en gros quand l'API me renvoie des infos), je redessine sur le Graphics2D sans le vider : en gros, je viens refaire des traits là où y'en a déjà, et pire : le dessin précédent reste là (imaginez une girouette où au final toutes les positions restent affichées ...)

    Comment videz le Graphics2D avant de redessiner ?

    Merci d'avance,
    Ch'Portos.

    P.S.: J'ai bien essayé de remplir mon Graphics2D avec un rectangle, mais dans ce cas je pers la transparence ...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Par défaut
    Bon, j'ai réussi !

    J'ai ajouté ces deux lignes de codes dans la méthode obtainGraphics de JackHack :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    this.graphics2D.setBackground(new Color(255,255,255,0));
    this.graphics2D.clearRect(0,0,this.getSize().width,this.getSize().height);
    Et ça marche !

    Merci ecncore !
    Ch'Portos.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 55
    Par défaut
    Et résolu aussi pour mon problème de non-disparition des objets ..

    Cordialement,
    Ch'Portos.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/03/2010, 13h02
  2. Réponses: 0
    Dernier message: 30/07/2008, 12h02
  3. [Débutant]réalisation d 'une applet ,voir sujet.
    Par racoboss dans le forum Applets
    Réponses: 3
    Dernier message: 06/11/2007, 18h03
  4. réalisation d'une applet à partir d'une application
    Par sissi25 dans le forum Applets
    Réponses: 3
    Dernier message: 30/03/2007, 16h12
  5. Réponses: 2
    Dernier message: 02/05/2006, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo