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

AWT/Swing Java Discussion :

Repaint a JPAnel


Sujet :

AWT/Swing Java

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2022
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2022
    Messages : 31
    Points : 28
    Points
    28
    Par défaut Repaint a JPAnel
    Bonjour,

    Pour permettre aux utilisateur de personnaliser leurs écrans et en particulier ajouter des textures j'ai créé une extension de JPanel afin de réaliser le chargement de la texture. Mais si pour une raison ou une autre, le panneau devient invisible pour quelques instants, la texture disparait.
    J'ai essayé plusieurs choses, en particulier de lancer la méthode repaint(), mais cela n'a pas d'effet positif (au contraire).

    Pour illustrer mon propos, ci-dessous il y a une Classe JFrame (TestTexture) dans laquelle est ajoutée l'extension d'un JPanel (que j'ai appelé GPanel), et la classe GPanel dans laquelle je charge la texture. Si vous souhaitez faire l'essai, il faut changer le nom de la texture par votre propre image. Bien sûr ce n'est qu'un test et la programmation est loin d'être dans l'état de l'art.

    Vous remarquerez alors que lorsque l'application démarre une liste d'affiche, mais dès que l'on presse le bouton "Information" pour afficher un JOptionPane, j'ai volontaire rendu le panneau principal invisible, pour le réafficher ensuite. Il réapparait, mais sans la texture. Comme j'utilise un Graphics2D pour réaliser le chargement, et qu'il faut que que la panneau soit visible, il a fallu que je fasse ceci de façon asynchrone (d'où le Thread).

    Ma question est simple : comment faire pour qu'elle ne disparaisse pas ?

    Merci d'avance.*

    Gérard


    Classe GPanel
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    package test;
     
    import javax.swing.JPanel;
    import java.awt.Component;
    import java.awt.Container;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.TexturePaint;
    import java.awt.geom.Rectangle2D;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import cinephil.Common;
     
    public class GPanel extends JPanel  implements Runnable   
    {
    	/*--------------------------------------------------------------------------------------------------------*/
    	/*                           Variables et constantes 													  */
    	/*--------------------------------------------------------------------------------------------------------*/	
     
    	private static final long 		serialVersionUID 	= 4308403780515447856L;
     
    	private   Component         maClasse  			= null;
    	private String	userdir = System.getProperties().getProperty("user.dir");
     
    	private String maTexture =  userdir +  "/Textures/" + "texture5.jpg";
     
    	/*---------------------------Fin des déclaratives-----------------------------------------------è---------*/
    	public GPanel( ) 
    	{
    		super();
    	}
     
    	public GPanel(JFrame f) 
    	{
    		 super();
    		 maClasse = f;
    		 try
    	    	{
    	    		GPanel g = this; 
    	    		Thread t1 = new Thread(g);
    	    		t1.start();   
    	    	}
    	    	catch (Exception ex) { }  
        }
     
        public void run()
    	{
        	//  System.out.println("Entré dans run");
        	File filetexture = new java.io.File(maTexture);
       		if (!filetexture.exists()) 
    		{
       			System.out.println("Pas de fichier");
    		    return;   // ce fichier n'existe pas 
    		} 
     
        	boolean exit = false;
        	Graphics g = null;
    		// System.out.println("Thread entré");
    		try
    		{
    			// on attend jusqu'à que le panneau soit visible. 
    			while (!exit)
    			{
    				g = maClasse.getGraphics();
    				if (g != null) exit = true;
    				// System.out.println("J'attends");
    				Thread.sleep(100);
    			}
    			Graphics2D g2 = (Graphics2D) g;
    	   		BufferedImage   mImage = ImageIO.read(filetexture);
    		  	Rectangle2D tr = new Rectangle2D.Double(0, 0, mImage.getWidth(), mImage.getHeight());
    		    TexturePaint tp = new TexturePaint(mImage, tr);
     
    	    	g2.setPaint(tp);
    			Rectangle  r =   this.getBounds();    // limites de ce container 
    			Rectangle shape = new Rectangle(0, 0,(int) r.getWidth(),(int) r.getHeight()); 
    	    	g2.fill(shape);
     
    	    	// repaint  tous les   composants de ce panneau
    	    	Container  p = (Container) this;
    	    	Component[] liste = p.getComponents();
    	    	for (Component c : liste)
    	    	{
    	    		  c.repaint();
    	    	}
     
    	    	return;
    		}
    	    catch (Exception ex)  
    	   	{ 
    	    	Common.afficherErreur(ex,"CinePanel","setTexture");
    	    }
    	}
    }

    Classe TextTexture
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    package test;
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.Random;
    import javax.swing.DefaultListModel;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JList;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
     
    public class TestTexture extends JFrame 
    {
    		private static final long serialVersionUID = 1L;
    		private GPanel 				MaRacine	= null;
    		private JScrollPane 		Scroll1 	= null;						 
    		private JList 				Liste1 		= null;	
    		private JButton 			Info 		= null,
    									Terminer    = null;
    		private DefaultListModel 	model1	 	= null;
    		// private JFrame 				owner 		= null; 
    		int i =0;
    		String ligne = "";
    		String[] CoulsA = {"#0000FF", "#FF0000", "#00FF00", "#FFCC00", "#00CED1", "#0000FF", "#FF0000", "#00FF00", "#FFCC00", "#00CED1"  };
    		String[] CoulsF = {"bleue", "rouge", "verte", "jaune" , "turquoise", "bleue", "rouge", "verte", "jaune" , "turquoise"}; 
    		int x= 0;
    		int [] ctr = {0,0,0,0,0};
     
     
    	public  TestTexture()  
    	{
    		super();
    		créerBoites();
    		initialize();
    	}
     
    	private void créerBoites()
    	{
    		this.setSize(690,460);
    		this.setName("TestTexture");
    		this.setUndecorated(true);
    		getContentPane().setName("TestTexture");
     
    		MaRacine =  new  GPanel(this);
    			MaRacine.setLayout(null);
    			MaRacine.setBounds(0, 0, 690,460);
    			MaRacine.setName("MaRacine");
    			getContentPane().add(MaRacine);
     
    	      Terminer = new JButton("Terminer");
    			Terminer.setBounds(165, 366, 111, 23);
    			Terminer.setName("Terminer");
    			MaRacine.add(Terminer);
                           Terminer.addActionListener(new ActionListener() 
                           {
    			   public void actionPerformed(ActionEvent arg0) 
    			   {
    				System.exit(0);
    			   }
    		      });
     
    	   Info = new JButton("Information");
    	   Info.addActionListener(new ActionListener() 
    	   {
    	   	public void actionPerformed(ActionEvent arg0) 
    	   	{
    	   	     setVisible(false);
    	   	     String texte = "";
    	   	     String spaces = "           ";
    	   		for (i=0; i<ctr.length;i++)
    	   		{
    	   			// pour  aligner les lignes
    	   			String couleur = CoulsF[i];
    	   			int x = 9- couleur.length(); // nombre de blancs à ajouter
    	   			String wk = spaces.substring(0,x*2);
    	   			couleur += wk;
    	   			texte += "Lignes " + couleur + "  : " + ctr[i]  + " %\n";
    	   		}  
    	   		JOptionPane.showMessageDialog(null ,texte );
     
    	               setVisible(true); 
    	   	}
    	   });
    	   Info.setName("Info");
    	   Info.setBounds(362, 366, 127, 23);
    	   MaRacine.add(Info);
     
     
              Liste1  = new JList();
    	   Scroll1 = new JScrollPane(Liste1);
    	   Scroll1.setBounds(178, 11, 261, 288);
    	   MaRacine.add( Scroll1);
    	}
     
     
    	private void initialize()
    	{
    		model1 = new DefaultListModel();
    		 Random rand = new Random();
    		 for (i = 0; i<100; i++)
    		 {
    			x=  rand.nextInt(99);
    			 while (x>=10)
    			 {
    				  String s = String.valueOf(x) ;
    				  int di = Integer.parseInt(s.substring(0,1));
    				  int ui = Integer.parseInt(s.substring(1));
    				  x = di+ui;
    			 }
     
    			 if (x > CoulsA.length -1) x = CoulsA.length -1;
    			 int y = x % 5; // modulo 5  
    			 ctr[y]++;
    			 ligne = "<html><body><Font color=" + CoulsA[x] + "> Cette  ligne est " + CoulsF[x] + 
    					 " </Font></body></html>";
    			  model1.addElement(ligne);
    		}
    		Liste1.setModel(model1);
    		this.setLocationRelativeTo(null);
    		setVisible(true);
    	}
     
    	public static void main(String[] args) 
    	{
    		new TestTexture();
    	}	
    }

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2022
    Messages
    31
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2022
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    J'ai trouvé la solution :

    Il suffisait que je surcharge la méthode paintComponent(Graphics g) pour recharger la texture.
    Ca marche impec.

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

Discussions similaires

  1. [JPanel] paint, paintComponent et repaint ?
    Par Pill_S dans le forum Composants
    Réponses: 8
    Dernier message: 08/02/2013, 17h38
  2. pb repaint sur JPanel contenu dans un JScrollPane
    Par pcouas dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 12/03/2009, 12h27
  3. [Débutant]repaint un JPanel
    Par Tex-Twil dans le forum AWT/Swing
    Réponses: 6
    Dernier message: 17/08/2007, 00h02
  4. pb repaint() sur JPanel
    Par david06600 dans le forum AWT/Swing
    Réponses: 3
    Dernier message: 06/06/2007, 16h39
  5. JPanel et repaint()
    Par manouchka dans le forum AWT/Swing
    Réponses: 8
    Dernier message: 14/07/2006, 10h15

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