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(); } }
Partager