Par "avant d'ouvrir la fenêtre", je voulais dire "avant d'afficher la fenêtre" : tout ce qui peut prendre du temps et que tu fais entre le moment où la fenêtre est visible et le moment où la première image du premier panneau s'affiche, contribue au délai dont tu parlais. En plus, effectivement, le fait de sortir le chargement de l'image d'une méthode exécutée dans le thread swing, evite de faire des accès disques, relativement long, et en plus répétés inutilement à chaque affichage.
Tu peux faire tout simplement, par exemple (voir les commentaires dans le 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 public class Panneau extends JPanel { private final Image image; public Panneau(Image image) { this.image=image; } public void paintComponent(Graphics g){ if ( IMAGE!=null ) g.drawImage(IMAGE, 0, 0, this.getWidth(), this.getHeight(), this); } }
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 public class Fenetre extends JFrame { public Fenetre() { super(); init(); } private Image readImage(String imagePath) { try { return ImageIO.read(new File(imagePath)); // return ImageIO.read(getClass().getResource(imagePath)); // tu pourrais faire comme ça, en plus, si tu exportes ton appli en jar, tu n'auras pas de problèmes d'emplacement de fichiers et tu pourras les intégrer dans le jar } catch (IOException e) { e.printStackTrace(); } return null; } private void init () { final JPanel panneau1=new Panneau(readImage("image1.jpg")); final JPanel panneau2=new Panneau(readImage("image2.jpg")); ActionListener listener = new ActionListener (){ // <- accolade de début de classe anonyme private int pan = 0; @Override public void actionPerformed(ActionEvent evt) { switch(pan++% 2){ case (0):Fenetre.this.setContentPane(panneau1); Fenetre.this.validate(); break; case (1):Fenetre.this.setContentPane(panneau2); Fenetre.this.validate(); break; } } }; Timer timer = new Timer (1000, listener); timer.setInitialDelay(0); // on a fait un max de choses avant d'ouvrir/afficher la fenêtre this.setTitle("Série d'images"); this.setSize(500, 500); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // enfin ça aussi, on peut considérer que ça fait partie des max de choses à faire avant d'ouvrir/afficher la fenêtre this.setContentPane(panneau); // afficher par défaut l'image correspondant à 1%2==0 (donc la fenêtre n'apparaitra jamais "grise") // si pas setInitialDelay(0) this.setContentPane(panneau2); // afficher par défaut l'image correspondant ) à 1%2==1 this.setVisible(true); timer.start (); } }
Partager