Salut a tous!
Comme dans le titre dans la méthode ActionPerformed d'un JButton je veux qu il lance un .exe censé de faire un traitement d'image et créer donc une image qui reste sauvegardée sur le desktop, et puis l'afficher. si je clique sur l'exe l'image apparait sur mon bureau.. donc il marche. si je le lance depuis l'interface graphique il me donne un erreur, et je crois car après avoir lancé .exe (comme process) il passe a la ligne suivante ou il dit d'afficher une image depuis un lien qui adresse encore a rien si l'exe n'a pas fini! donc j'ai pensé..... il faut utiliser les THREADS
voici une classe photo
et Affiche (dont le filepath c est l'image creé par l'.exe)
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 class Photo extends Thread {public synchronized void Crea(Boolean existe)throws InterruptedException {if (existe==false) { System.out.println("on cree la photo"); existe = true; notifyAll();} else {System.out.println("la photo existe");} } public synchronized void Affiche(Boolean existe) throws InterruptedException {if(existe==true){ System.out.println("on affiche la photo"); } else { System.out.println("je ne peux pas afficher la photo"); wait(); } } private Boolean existe=false; } et puis j'ai cree la classe Creer (dont le filepath c'est le filepath de l'.exe) class Crea extends Thread { public Crea (Photo p, String filePath) {this.p=p; this.filePath=filePath;} @Override public void run() {try {while(!interrupted()) {Process p = Runtime.getRuntime().exec(filePath);} } catch (IOException ex) { Logger.getLogger(Crea.class.getName()).log(Level.SEVERE, null, ex); } } private Photo p; private String filePath; }
Je sais que ça fait beaucoup de code, mais je savais pas comme poser la question autrement.. je ne vois pas ou mon traitement de la synchronisation "creer et affiche" bugge ... peut être que en graphique les threads son traités différemment?? merci pour tout sorte de conseil!!
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 class Affiche extends Thread { public Affiche (Photo p,String filePath) {this.p=p; this.filePath=filePath; } @Override public void run() {try {while(!interrupted()) {this.result=ImageIO.read(new File(filePath));} } catch (IOException ex) { Logger.getLogger(Affiche.class.getName()).log(Level.SEVERE, null, ex); } } private Photo p; private String filePath; BufferedImage result; } et voici finalement l'actionperformed de mon JButton (qui est dans la classe qui extends le JFrame): private void getoldActionPerformed(java.awt.event.ActionEvent evt) { String filePath1 = "C:\\Users\\...\\Desktop\\....exe"; String filePath2 = "C:\\Users\\...\\Desktop\\result.png"; try { Photo p = new Photo(); Crea cp= new Crea (p,filePath1); cp.start(); Affiche ap= new Affiche (p,filePath2); ap.start(); this.result = ap.result; } catch (Exception e) { } double reduction=270./(this.width); resultlb.setBounds(900, 10, photoaging2.scale(this.result,reduction).getWidth(null), this.scale(this.result,reduction).getHeight(null)); resultlb.setIcon(new ImageIcon(photoaging2.scale(this.result,reduction))); }
bisous
ps.scale c'est une méthode définie par moi qui marche pour afficher une image redimensionnée correctement!
Partager