Ça fonctionne mais j'aimerai juste récupérer soit image, soit video, soit texte et la je récupère "application/octet-stream" quand j'ai une video...
Version imprimable
Ça fonctionne mais j'aimerai juste récupérer soit image, soit video, soit texte et la je récupère "application/octet-stream" quand j'ai une video...
C'est parce que l'extension de ton fichier n'est pas gérée en standard par la MimeTypeMap. Application/Octet-stream c'est le type de base (tout fichier est une suite d'octets).
La map par défaut est :
Tu peux en trouver de plus étendues sur le net (par exemple, celle d'Apache).Citation:
text/html html htm HTML HTM
text/plain txt text TXT TEXT
image/gif gif GIF
image/ief ief
image/jpeg jpeg jpg jpe JPG
image/tiff tiff tif
image/x-xwindowdump xwd
application/postscript ai eps ps
application/rtf rtf
application/x-tex tex
application/x-texinfo texinfo texi
application/x-troff t tr roff
audio/basic au
audio/midi midi mid
audio/x-aifc aifc
audio/x-aiff aif aiff
audio/x-mpeg mpeg mpg
audio/x-wav wav
video/mpeg mpeg mpg mpe
video/quicktime qt mov
video/x-msvideo avi
Tu peux gérer ta propre map éventuellement (en copiant l'un des fichiers et en ajoutant tes entrées, en respectant le format).
Soit, en utilisant un fichier de ressource, que tu charges (par un new MimetypesFileTypeMap(inputStream), inputStream que tu récupères par Class.getResourceAsStream()...), ou alors tu utilises le système de chargement de mimetype par défaut, basé sur un ordre de préférence (décrit dans la javadoc), en gros, le simple est de mettre le fichier dans le dossier META-INF (et de bien penser à l'inclure dans le jar de distribution).
Sinon gérer les cas d'extensions qui ne sont pas standard à part, par switch, genre (le fichier mime.types est bien plus simple à éditer quand même) :
Ensuite, tu peux te faire juste un startsWith pour distinguer image et video.Code:
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 public static String getFileType(File file) { String fileType = MimetypesFileTypeMap.getDefaultFileTypeMap().getContentType(file.getName()); if ( "Application/Octet-stream".equals(fileType) ) { String fileExtension = getExtension(file); if ( fileExtension!=null ) { switch(fileExtension.toLowerCase()) { case "flv": // Flash fileType = "video/x-flv"; break; case "mp4": // MPEG-4 fileType = "video/mp4"; break; case "wmv": // Windows media fileType = "video/x-ms-wmv"; break; case "mkv": // Matroska video fileType = "video/x-matroska"; break; case "mk3d ": // Matroska 3D video fileType = "video/x-matroska-3d"; break; /*... etc ... */ } } } }
Voila j'ai créé cette petite méthode :Est-ce que c'est comme ça que je récupère la map de Apache (J'ai quelque doutes) ?Code:
1
2
3
4
5
6
7
8
9
10
11
12
13 public static String obtenirType() { InputStream inputStream=Obtention.class.getResourceAsStream("https://svn.apache.org/repos/asf/httpd/httpd/trunk/docs/conf/mime.types"); //on prend la map de apache MimetypesFileTypeMap map = new MimetypesFileTypeMap(inputStream); String fileType; if(map.startsWith("image")){ fileType="image"; }else if(map.startsWith("video")){ fileType="video"; }else{ fileType="texte"; } return fileType; }
Et le startsWith ne fonctionne pas car j'utilise la il demande un string et je lui donne la map mais je ne vois pas comment lui donner le contenu.
Bah non, à supposer que ça fonctionne (une ressource c'est un fichier situé dans le classpath de ton application), on se connecterait à chaque fois à distance pour la lire, pour chaque fichier ! Pour peu que le serveur soit tombé, ou qu'on ait pas de connexion, et on ne pourrait pas lancer l'application.
Tu télécharges une fois pour toute le fichier, ce qui te permet en plus d'ajouter les entrées qui te manquent (par exemple les Matroska, je ne pense pas qu'ils y soient).
Ensuite, tu le colles dans tes sources. Par exemple, juste à côté de ton fichier .java avec la méthode obtenirType (si tu travailles avec un IDE, le fichier sera automatiquement copié avec les .class à la compilation), et tu lis le fichier par
Code:
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 public class Obtention { private static final MimetypesFileTypeMap MIMETYPE_MAP = loadMimeTypeMap(); private static MimetypesFileTypeMap loadMimeTypeMap() { MimetypesFileTypeMap map = null; try(InputStream inputStream = Obtention.class.getResourceAsStream("mime.types")) { // le fichier mime.types doit être dans le même dossier que Obtention.java map = new MimetypesFileTypeMap(inputStream); } catch (IOException e) { } return map; } public static String obtenirType(File file) { String fileType = MIMETYPE_MAP.getContentType(file.getName()); // on demande le mimetype pour le nom de fichier voulu if(fileType.startsWith("image/")){ fileType="image"; }else if(fileType.startsWith("video/")){ fileType="video"; }else if(fileType .startsWith("text/")){ fileType="texte"; }else { fileType="autre"; } return fileType; } }
[/quote]
Bah oui, tu utilises la mimetypemap pour obtenir le mimetype, et ensuite à partir du mimetype, tu peux utiliser startsWith("image/") ou startsWith("video/") pour savoir si le mimetype, c'est de l'image, de la video ou autre... (pas forcement du texte d'ailleurs, tous les types texte commenceront par "text/", donc tu peux éliminer tous les fichiers dont tu ne sauras pas traiter l'extension (enfin attention si tous les text/ peuvent se lire comme du texte, ce n'est pas forcément du "texte" au sens "litéraire" (du XML ou du CSV, c'est du text/...)).
Bonjour, bon j'ai un petit probleme : a chaque fois que j'enregistre mon XML avec un nom(par exemple je le nomme : fichier) et bien quand je vais voir dans le dossier ou il a été enregistrer il s'appelle Optionnal[fichier]...
et je ne comprends pas pourquoi.
A priori, tu utilises la classe Optional quelque part dans ton code.
System.out.println(Optional.of("fichier")); va afficher justement Optional[fichier].
Il ne faut pas directement utiliser l'instance d'optional : il faut vérifier la présence d'une valeur et l'exploiter le cas échéant. Ou utiliser orElse qui permet de récupérer la valeur présente, ou une valeur par défaut s'il n'y a pas de valeur :
Code:
1
2
3 Optional<String> opt = ... String string = opt.orElse( "défaut" ); // si opt est Optional[Fichier], alors string sera "fichier", et si opt est Optional.empty, alors string sera "défaut".
ah oui en effet, j'ai fait les modifications et ça fonctionne mieux !
Mais bon comme tout le temps en programmation me voila face a un autre problème, j'ai un fichier "configuration.properties" dans mon package "fr.packagea" et j'utilise un fileReader pour le lire mais il me dit que le fichier est introuvable
j'ai essayé avec differents chemin : "fr.packagea.configuration.properties", "packagea.configuration.properties", "\\configuration.properties", "/configuration.properties" mais il ne le trouve jamaisCode:FileReader in = new FileReader("configuration.properties");
Code:java.io.FileNotFoundException: packagea.configuration.properties (Le fichier spécifié est introuvable)
Si ton fichier est dans un package, c'est qu'il est dans le source. On exécute pas des sources. Les sources sont compilées en .class, ailleurs, puisque ce ne sont pas des sources, et qui sont elles exécutées.
Ensuite, quand tu accèdes à un fichier, il faut soit lui donner un path absolu (complet), soit relatif, mais dans ce cas, il est relatif à un environnement d'exécution : cet environnement n'est en aucun cas le dossier des sources.
Seulement, si un jour tu veux distribuer ton programme facilement, tu vas probablement en faire un jar, une archive donc. Un seul fichier autrement dit. Avec les .class dedans, et ton fichier de configuration aussi. Donc ce ne sera de toute manière plus un fichier (il sera dans un fichier, avec plein d'autres). Pour y accèder on ne peut plus utiliser File ou Path, ou les constructeurs de Reader ou d'InputStream prenant une String, parce que ceux-ci sont juste des constructeurs de convénience pour les constructeurs prenant un File en paramètre.
Les fichiers qu'on met dans les sources sont automatiqueemnt recopiés par l'IDE là où il met les classes (les .class). Il faut y accèder par URL, dont on obtient l'inputstream par URLopenStream(). Pour obtenir l'URL du fichier, qu'il soit dans le dossier des .class, ou le .jar, on utilise la méthode getResource() de la classe Class. On peut même obtenir directement le stream par getResourceAsStream(). Et ces deux méthodes, en revanche, ne prennent pas un chemin de fichier en paramètre, mais un identifiant dans un espace de noms constitué des packages, dont la racine est la racine du dossier de classes, ou du jar (donc commençant par un / pour absolu par rapport à la racine du jar, ou pas de / devant pour relatif à la classe sur laquelle on appelle le getResourceAsStream().
Et un FileReader ne prend pas d'URL en paramètre, mais tu as d'autres readers (InputStreamReader par exemple).
A noter qu'il existe aussi une classe Properties (mais ça impose que ton fichier soit ISO 8859-1)
Code:
1
2
3
4
5 Properties properties = new Properties(); try(InputStream inputStream = LaClasse.class.getResourceAsStream("configuration.properties")) { // configurations.properties est au même endroit que la classe LaClasse properties.load(inputStream); } String valeur = (String)properties.get("nomdepropriété");
Parfait, merci !! Mon fichier doit etre en ISO 8859-1 car je récupère bien toutes les valeurs des clés mais la j'ai une clé qui s'appelle "adresseIP" et qui me sert a envoyer des infos à une adresse IP mais j'aimerais savoir : si la personne souhaite envoyer à plusieurs adresse Ip elle puisse écrire plusieurs clés "adresseIP" du style :
ou alors comme caCode:
1
2 adresseIP=192.168.0.216 adresseIP=192.168.0.211
j'ai tester avec les deux clés identiques mais bien entendu ma variable prend la valeur de la dernière clé et j'aimerais qu'a chaque adresse IP différente j'envoie les infosCode:adresseIP=192.168.0.216/192.168.0.211
la méthode qui récupère les propriétés du fichier conf :
et le code qui envoie a chaque adresse ip :Code:
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 String propriete(int i) throws IOException{ Properties prop=new Properties(); String res=""; try(InputStream inputStream = ObtentionVerification.class.getResourceAsStream("conf.properties")) { // configurations.properties est au même endroit que la classe LaClasse prop.load(inputStream); }catch(Exception e){ } //on extrait les données switch (i) { case 0: String destinationCopie=prop.getProperty("destinationCopie"); res=destinationCopie; break; case 1: String adresseIP=prop.getProperty("adresseIP"); res=adresseIP; break; case 2: String enregistrementFichierXML=prop.getProperty("enregistrementFichierXML"); res=enregistrementFichierXML; break; default: break; } return res; }
et puis je souhaite ouvrir ce meme fichier mais il n'y a aucune méthode "open" avec la variable "open", je fais doncCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void envoiRequete(String nom, LocalTime hDebut,LocalTime hFin) throws IOException { // TODO code application logic here //i vaut 1 car dans la méthode propriete la valeur 1 est pour l'adresse Ip int i=1; //Boucle pour chaque adresse IP //for (adresse ip... ObtentionVerification ob=new ObtentionVerification(); String adresseIP=ob.propriete(i); String chemServeur="http://"+adresseIP+"/resultat.php?"; //debut chemin du serveur String mpd="mdp:2017"; String heureDebut="&heureDebut="+hDebut; //on attribue l'heure du début au chemin qui sera envoyé String heureFin="&heureFin="+hFin; //on attribue l'heure de fin au chemin qui sera envoyé String nomXML="&nomXML="+nom; //on attribue le nom du XML au chemin qui sera envoyé URI uri = URI.create(chemServeur+mpd+heureDebut+heureFin+nomXML); //on envoie le chemin Desktop.getDesktop().browse(uri); //ouverture dans un navigateur }
mais un file ne prend pas de stream ca fonctionne avec un chemin en dur mais je ne souhaite pas avoir un chemin en dur...Code:
1
2 Desktop desk = Desktop.getDesktop(); desk.open(FXMLDocumentController.class.getResourceAsStream("conf.properties"));
Pas avec un Properties : la clef doit être unique. Sinon tu peux utiliser le séparateur que tu veux (un slash, une virgule...)
voilà
C'est-à-dire ? Tu veux dire que tu as des informations particulières associées à chaque IP ?
Tu peux faire comme çà par exemple :
Ou alors :Citation:
adresses=192.168.0.216, 192.168.0.211
192.168.0.216=info1, info2, info3
192.168.0.211=info1, info2, info3, info4
Aussi, éviter de lire le fichier à chaque fois qu'on demande une ip. Par exemple, avec le même système de propriétésCitation:
nb=2
address1=192.168.0.216,info1, info2, info3
address2=192.168.0.211,info1, info2, info3, info4
Code:
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 public class AdresseIP { private final static AdresseIP[] ADRESSES = load(); private final static AdresseIP[] load() { try(InputStream inputStream = AdresseIP.class.getResourceAsStream("conf.properties")) { // configurations.properties est au même endroit que la classe LaClasse Properties prop=new Properties(); prop.load(inputStream); int nb = Integer.parse( (String)prop.getProperty("nb") ); AdresseIP[] adresses = new AdresseIP[nb]; for(int i=0; i<nb; i++) { String[] infos = ((String)prop.getProperty("address"+i).split(",\s+"); adresses[i]= new AdresseIP(infos[0], infos[1], "true".equalsIgnoreCase(infos[2])); } return adresses; }catch(Exception e){ e.printStackTrace(); } return new AdresseIP[0]; } private final String ip; private final String destinationCopie; private final boolean enregistrementFichierXML; private AdresseIp(String ip, String destinationCopie, boolean enregistrementFichierXML) { this.ip=ip; this.destinationCopie=destinationCopie; this.enregistrementFichierXML=enregistrementFichierXML; } public static AdresseIP get(int i) { return ADRESSES[i]; } public static List<AdresseIP> getAdresses() { return Arrays.stream(ADRESSES).collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)); } }
Pour utiliser un int, pour accèder aux différentes informations. C'est un bon moyen pour embrouiller (être obligé de se souvenir que enregistrementFichierXML c'est 2, dans 2 ans, ou 5, c'est un peu vicelar, et puis si tu veux pouvoir changer l'ordre, ou insérer une nouvelle propriété, ou en supprimer une, il faut modifier tout le code appelant). Déjà, premièrement, les propriétés ont un nom. Autant l'utiliser. On peut utiliser un int, mais au moins utiliser des constante (vallable aussi si on utilise les noms des propriétés directement). Ou une enum, qui permet de s'assurer qu'on appelera pas une propriété non existante.
Déjà, conf.properties, ce n'est pas un fichier, mais une sous-partie d'un fichier jar. Donc tu peux tout de suite oublier Desktop.open() qui sert à utiliser l'application configurée dans le système pour ouvrir un fichier.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 Quelle variable open ? <div class="bbcode_container"> <div class="bbcode_description">Citation:</div> <div class="bbcode_quote printable"> <hr /> <div> Envoyé par <strong>Java Ou Javapas</strong> <a href="showthread.php?p=9145193#post9145193" rel="nofollow"><img class="inlineimg" src="https://forum.developpez.be/images/buttons/viewpost.gif" alt="Voir le message" /></a> </div> <div class="message"> desk.open(FXMLDocumentController.class.getResourceAsStream("conf.properties"));</div> <hr /> </div> </div>
Parce que c'est quoi le but au juste ? Permettre la modification de la configuration par l'utilisateur ?
En fait si il y a deux IP la méthode envoiRequete() doit s’exécuter deux fois (une fois pour chaque adresse IP) si on aCitation:
C'est-à-dire ? Tu veux dire que tu as des informations particulières associées à chaque IP ?
la méthode s'éxécute avec l'adresse 192.168.0.216 puis ensuite avec l'adresse 192.168.0.211Citation:
adresseIP=192.168.0.216
adresseIP=192.168.0.211
Oui via l'IHM, mais je ne sais pas si c'est une bonne idée...il faut qu'il puisse changer le fichier mais je me demande si il vaut mieux pas le laisser aller chercher dans les dossiers...Citation:
Parce que c'est quoi le but au juste ? Permettre la modification de la configuration par l'utilisateur ?
Comme je te l'ai dit, ce n'est pas possible avec un fichier de propriétés géré par la classe Properties. On trouve des implémentations sur le net qui étendent les capacités des Properties. Il y a le format ini aussi (il y a des API Java), les format XML ou Json, etc.
Ce n'est pas possible : on ne peut pas modifier un fichier faisant partie des ressources inclues dans le jar qui constitue l'application elle-même (il est même verrouillé sur certains systèmes).
Eventuellement, tu peux embarquer un fichier de ressources, que tu déploies automatiquement, lors du lancement, dans un dossier particulier (s'il n'est pas déjà présent), et les modifications se font dans ce fichier. Il y a également le système de préférences de Java (le fichier de propriétés ne servant que de valeurs par défaut).
ah.... c'est embêtant ça...et avec un fichier ini on peut avoir une seule proprietes avec plusieurs valeurs et pour chaque valeur la méthode est différente ?Citation:
Comme je te l'ai dit, ce n'est pas possible avec un fichier de propriétés géré par la classe Properties. On trouve des implémentations sur le net qui étendent les capacités des Properties. Il y a le format ini aussi (il y a des API Java), les format XML ou Json, etc.
aaaah.....c'est encore plus embêtant ça...et comment comment on fait ça ?Citation:
Ce n'est pas possible : on ne peut pas modifier un fichier faisant partie des ressources inclues dans le jar qui constitue l'application elle-même (il est même verrouillé sur certains systèmes).
Eventuellement, tu peux embarquer un fichier de ressources, que tu déploies automatiquement, lors du lancement, dans un dossier particulier (s'il n'est pas déjà présent), et les modifications se font dans ce fichier. Il y a également le système de préférences de Java (le fichier de propriétés ne servant que de valeurs par défaut).
Bah, oui et non, dans la mesure où je t'ai dit comment contourner ça.
Ça dépend. Le format standard ne permet la duplication de noms qu'à travers les sections (un nom est unique dans une section). Il existe des APIs qui autorisent la duplication, en général du moins, mais j'ignore s'il existe une API Java (le format ini étant un format Windows, il est peu répandu en dehors de cette plateforme, donc à fortiori sur un sytème multiplateforme.
Bah, comme je te l'ai indiqué, par exemple. Ou encore en indiquant le path du fichier de configuration dans la ligne de commande aussi, entre autres.
Bon j'ai gardé mon fichier properties mais je vais le chercher avec un chemin et j'ai fait en sorte que pour chaque clé qui commence par "adresse" je les stocke dans un Vector
Code:
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 String propriete(String i) throws IOException{ String res=""; //on extrait les données FileInputStream fis = new FileInputStream("src/fr/packagea/conf.properties"); ResourceBundle bundle = new PropertyResourceBundle(fis); switch (i) { case "destinationCopie": String destinationCopie=bundle.getString("destinationCopie"); res=destinationCopie; break; case "enregistrementXML": String enregistrementXML=bundle.getString("enregistrementXML"); //String enregistrementFichierXML=prop.getProperty("enregistrementFichierXML"); res=enregistrementXML; break; default: break; } return res; } Vector proprieteIP() throws IOException{ Vector<String> adresseIP=new Vector<String>(); FileInputStream fis = new FileInputStream("src/fr/packagea/conf.properties"); ResourceBundle bundle = new PropertyResourceBundle(fis); Iterator<String> it = bundle.keySet().iterator(); while (it.hasNext()){ String key = (String)it.next(); if (key.startsWith("adresse")){ adresseIP.add(bundle.getString(key)); } } return adresseIP; } }
J'approche de la fin de mon projet et j'ai donc créé une image que j'utilise comme logo pour mon application mais lorsque je fais un raccourci sur le bureau je garde la tasse de café java alors que j'aimerais que ce soit l'image que j'ai créé qui y soit. Est-ce possible ?Code:
1
2
3
4
5
6
7
8
9
10
11 ObtentionVerification ob=new ObtentionVerification(); Vector<String> adresseIP=ob.proprieteIP(); for(int i=0;i<adresseIP.size();i++){ String chemServeur="http://"+adresseIP.get(i)+"/resultat.php?"; //debut chemin du serveur String mpd="mpd=2017"; String nomXML="&nomXML="+nom.orElse(null); //on attribue le nom du XML au chemin qui sera envoyé URI uri = URI.create(chemServeur+mpd+nomXML); //on envoie le chemin Desktop.getDesktop().browse(uri); //ouverture dans un navigateur } }
Ça dépend. Si c'est un raccourci vers un jar, que tu créés à la main, à partir d'une jar copié à la main, pas automatiquement, mais Windows te permet de choisir des icônes personalisées pour tes raccourcis. En automatique, Java Web Start le permet. Sinon, les outils pour créer une installeur (tu peux aussi te faire ton petit installeur) ou de packaging qui générèrent un .exe le permettent.
Je cherche maintenant a faire un apercu pour l'utilisateur, la personne va cliquer sur un bouton "apercu" et une page web va s'afficher avec le scénario qui tourne est-ce faisable ? pour l'instant j'ai fait ça mais ca ne fonctionne pas (j'aimerais aussi afficher les videos)
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 void apercuHTML() throws IOException{ Scenario scenar=new Scenario(); File apercu =new File("la.html"); apercu.createNewFile(); FileWriter fw = new FileWriter (apercu); fw.write("<DOCTYPE html>\n<HTML>\n<HEAD>\n<TITLE>Apercu du Scenario</TITLE>\n </HEAD>"); //on ecrit le devut du fichier html for(ElementInit elem : scenar.tabElement){ // pour chaque element fw.write("<BODY>\n <div id=\"imgPatienter\">\n<img src="+elem.cheminFichier+"/>\n</div>" //on afficher l'image + "<script> document.getElementById('animFlash').style.display = \"block\";},"+elem.duree+");</script>\n </BODY>\n </HTML>"); //une fois l'image afficher on affiche l'autre } fw.close(); Desktop.getDesktop().browse(apercu.toURI()); }
Définis "çà ne fonctionne pas"... y'a rien qui s'affiche, y'a pas ce que tu veux qui s'affiche, y'a une exception, ça s'affiche mais mal foutu, le pc explose... il se passe quoi ?
Sinon, ce que je vois :
- S'il y a plus d'un élément, alors il y a trop de fermeture de la balise html et plusieurs body !
- y'a pas de quote pour l'attribut src de la balise img
- je ne suis pas un spécialiste du javascript, mais ça },"+elem.duree+"); me semble douteux (si elem.duree vallait 123, ça ferait },123); : c'est une instruction javascript valide ça ?)
- ton script manipule un id de valeur "animFlash"... je ne vois aucun élément avec cet id...
- Pas de fermeture propre du fichier en cas d'exception ! utilise un try-with-resource ou un try/finally au pire.
- apercu.createNewFile(); ne sert à rien
- Pas la peine de s'enquiquiner avec les \n dans le html (au pire le mode "dev" du navigateur s'en chargera si tu as besoin de déboguer le html).
Tu pourrais faire un aperçu avec un WebView JavaFX aussi, ça éviterait carrément de remplir ton disque avec des fichiers juste pour faire des aperçus. Ou créer des fichiers temporaires aussi, mais ça peut poser un souci par rapport aux favoris.
la page web s'affiche mais tout est blanc :) (j'ai voulu modifier le message mais c'etait trop tard)
Corrige déjà le HTML en fonction de ce que je t'ai dit. Et aide-toi avec le mode "dev" du navigateur pour voir les erreurs.
voila le code modifier :D'apres ce que j'ai vu le webView permet juste d'afficher une page html non ? et en utilisatant le mode dev sur la page web je viens de voir que les balises div et script ne sont pas présentes (ca doit etre un probleme avec mon for each)Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 void apercuHTML() throws IOException{ Scenario scenar=new Scenario(); File apercu =new File("Apercu.html"); try(FileWriter fw = new FileWriter (apercu)){ fw.write("<DOCTYPE html>\n<HTML>\n<HEAD>\n<TITLE>Apercu du Scenario</TITLE>\n </HEAD><BODY> "); for(ElementInit elem : scenar.tabElement){ fw.write("<div id=\"imgPatienter\"><img src=\""+elem.cheminFichier+"\"/></div>" +"<script> document.getElementById('imgPatienter').style.display = \"block\";},"+elem.duree+");</script>"); } fw.write("</BODY>\n </HTML>"); fw.close(); Desktop.getDesktop().browse(apercu.toURI()); }
Tu n'as pas corrigé les quote de l'attribut src de img. Ni le script (mais bon ça ne devrait pas empêcher l'affichage.
et, au fait, cheminFichier , c'est bien une URL ?Code:
1
2
3 fw.write("<div id=\"imgPatienter\"><img src='"+elem.cheminFichier+"'/></div>" +"<script> document.getElementById('imgPatienter').style.display = \"block\";},"+elem.duree+");</script>");
ça fera exactement comme n'importe quel navigateur (au détail de rendu et des trucs un peu sensibles qui fonctionnent différemment selon le navigateur, ni plus, ni moins, qu'entre 2 navigateurs classiques). Avec un bémol peut-être pour le flash, mais, de tout manière, il faut éviter le flash, mais dans un navigateur, si tant est qu'il en existe encore qui tolère le plug-in.
Toutfois, c'est vrai que pour les images, ça demande un peu de boulot pour faire un URLStreamHandler, mais y'a un exemple ici.
en effet je viens de corriger
oui
ok ca marche, je vais regarder ca d'un peu plus pres mais je pense rester sur l'idée de la page web (si j'arrive a trouver comment faire le script) et pourquoi ma boucle ne fonctionne pas...
je pige pas trop la, apperemment mon for each ne focntionne pas car quand je fais cales balises div et scrip ne s'affiche pasCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 void apercuHTML() throws IOException{ Scenario scenar=new Scenario(); File apercu =new File("Apercu.html"); try(FileWriter fw = new FileWriter (apercu)){ fw.write("<DOCTYPE html><HTML><HEAD><TITLE>Apercu du Scenario</TITLE> </HEAD><BODY> "); for(ElementInit elem : scenar.tabElement){ fw.write("<div id=\"img\"><img src=\""+elem.cheminFichier+"/></div>" +"<script type=\"text/javascript> var test = setTimeout(function(){document.getElementById('img').style.display = \"none\";},"+elem.duree+");</script>"); } fw.write("</BODY>\n </HTML>"); fw.close(); Desktop.getDesktop().browse(apercu.toURI()); } }
Code:
1
2 <DOCTYPE html><HTML><HEAD><TITLE>Apercu du Scenario</TITLE> </HEAD><BODY> </BODY> </HTML>
Montre-nous le code de la classe Scenario.
Code:
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231 package fr.packagea; //Classe qui possède plusieurs méthodes pour le scénario ///InsererElement //CreerXML //EnregistrerXML //copier //supprTableau import it.sauronsoftware.jave.EncoderException; import it.sauronsoftware.jave.InputFormatException; import it.sauronsoftware.jave.MultimediaInfo; import java.util.ArrayList; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.LocalTime; import java.util.Calendar; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.concurrent.TimeUnit; import javafx.scene.control.TextInputDialog; import javax.activation.MimetypesFileTypeMap; import org.jdom2.*; import org.jdom2.input.SAXBuilder; import org.jdom2.output.*; /** * * */ public class Scenario { ///Création d'un tableau "tabElement" de type Array list ArrayList<ElementInit> tabElement = new ArrayList<>(); //On créer la racine que l'on nomme scénario Element scenario = new Element("scenario"); org.jdom2.Document document = new Document(scenario); //méthode pour mettre un objet de la classe ElementInit dans un tableau et ainsi le sauvegarder void ajouterElement(ElementInit elem) { tabElement.add(elem); //On ajoute un objet dans le tableau } //méthode pour supprimer tous les obets du tableau void supprTableau(){ tabElement.clear(); //On enleve tous les objets du tableau } //méthode pour déplacer les éléments dans la collection et dans le tableView void deplacerElement(int x,int y){ if(x >= 0) { ElementInit toMove = tabElement.get(x); tabElement.set(x, tabElement.get(x-y)); tabElement.set(x-y, toMove); tabElement.get(x-y).rang=tabElement.get(x).rang; tabElement.get(x).rang=tabElement.get(x).rang+y; } } void supprimerElement(int eleSupprimer){ tabElement.get(eleSupprimer+1).rang=tabElement.get(eleSupprimer).rang+1; for(int j=eleSupprimer+1;j<tabElement.size();j++){ tabElement.get(j).rang=tabElement.get(j).rang-1; } tabElement.remove(eleSupprimer); } //méthode pour créer le fichier XML void creerXML(LocalTime hDebut,LocalTime hFin){ //On met l'heure de début du scénario Element heureDebut=new Element("heureDebut"); heureDebut.setText(hDebut.toString()); scenario.addContent(heureDebut); //On met l'heure de fin du scénario Element heureFin=new Element("heureFin"); heureFin.setText(hFin.toString()); scenario.addContent(heureFin); //Création d'une boucle pour mettre les elements du tableau for(ElementInit elem : tabElement){ //On créer un Element que l'on nomme "element" et dans lequel on va mettre tout les champs dedans Element element =new Element("element"); scenario.addContent(element); //On créer un Element pour le champ rang et on l'associe a element Element rang =new Element("rang"); rang.setText(String.valueOf(elem.rang)); element.addContent(rang); //On créer un Element pour le champ type et on l'associe a element Element type =new Element ("type"); type.setText(String.valueOf(elem.type)); element.addContent(type); //On créer un Element pour le champ duree et on l'associe a element Element duree =new Element("duree"); duree.setText(String.valueOf(elem.duree)); element.addContent(duree); //On créer un Element pour le champ nom et on l'associe a element Element nom =new Element("nom"); nom.setText(elem.nom); element.addContent(nom); //On créer un Element pour le champ descriptif et on l'associe a element Element descriptif =new Element("descriptif"); descriptif.setText(elem.descriptif); element.addContent(descriptif); //On créer un Element pour le champ chemin et on l'associe a element Element chemin =new Element("chemin"); chemin.setText(elem.cheminFichier); element.addContent(chemin); } } void creerXMLVide(){ Locale loc = new Locale("fr", "ca"); DateFormat df = new SimpleDateFormat("hh:mm", loc); Date d=new Date(); String dateF = df.format(d.getTime()); Element heureDebut=new Element("heureDebut"); heureDebut.setText("00:00"); scenario.addContent(heureDebut); //On met l'heure de fin du scénario Element heureFin=new Element("heureFin"); heureFin.setText(dateF.toString()); scenario.addContent(heureFin); } //méthode pour enregistrer le fichier XML void enregistrerXML(String fichier){ try { //On utilise ici un affichage classique avec getPrettyFormat() XMLOutputter sortie = new XMLOutputter(Format.getPrettyFormat()); sortie.output(document, new FileOutputStream(fichier+".xml")); } catch (java.io.IOException e){} } void insererElement(int pos,ElementInit ele){ tabElement.add(pos,ele); tabElement.get(pos).rang=tabElement.get(pos).rang-1; pos+=1; for(int i=pos;i<tabElement.size();i++){ tabElement.get(i).rang = tabElement.get(i).rang+1; } } int recupXML(File fichier){ SAXBuilder sax=new SAXBuilder(); try { //On crée un nouveau document JDOM avec en argument le fichier XML document = sax.build(fichier); } catch(IOException | JDOMException e){} //On recrée la racine du XML Element racine = document.getRootElement(); //On crée un tableau dynamique pour mettre tous les éléments du XML dedans List<Element> elementXML = racine.getChildren("element"); //On crée un iterator pour parcourir la liste Iterator o = elementXML.iterator(); //Parcours du tableau for(Element z : elementXML){ while(o.hasNext()){ Element courant = (Element)o.next(); ElementInit elem2=new ElementInit(); elem2.rang=Integer.parseInt(courant.getChildText("rang")); elem2.type=courant.getChildText("type"); elem2.duree=Integer.parseInt(courant.getChildText("duree")); elem2.nom=courant.getChildText("nom"); elem2.descriptif=courant.getChildText("descriptif"); elem2.cheminFichier=courant.getChildText("chemin"); ajouterElement(elem2); } } return elementXML.size(); } ElementInit getElement(int i){ ElementInit e=tabElement.get(i); return e; } void modifierElement(int i,ElementInit ele){ tabElement.set(i, ele); } //méthode pour copier les fichiers choisis dans un emplacement réseau public boolean copier() throws IOException { ObtentionVerification ob=new ObtentionVerification(); String destCopie=ob.propriete("destinationCopie"); for(ElementInit elem : tabElement){ Path source = Paths.get(elem.cheminFichier); Path destination=Paths.get(destCopie+elem.nom); //Chemin pour la copie des ressources try { //écrase le fichier destination s'il existe et copie les attributs de la source sur la destination. Files.copy(source, destination, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.COPY_ATTRIBUTES); } catch (IOException e) { e.printStackTrace(); //affiche l'exception et l'état de la pile d'exécution au moment de son appel return false; } elem.cheminFichier=destination.toString(); //met dans le tableau le chemin des fichiers copier à la place de ceux qui ont été sélectionné } return true; } }
Bah, ta classe n'a pas de contructeur, donc quand tu fais new Scenario(), ça te créer une instance avec 3 attributs :
- document, un document jdom2
- element un element jdom2 de nom "Scenario"
- tabElement, une liste de ElementInit vide
Ni plus, ni moins.
Est-ce que ce n'est pas plutôt une autre instance de Scenario, créée ailleurs, dont tu veux afficher l'aperçu ? Soit accessible en tant qu'attribut de la classe où se trouve la méthode apercuHTML(), soit que tu passerais en paramètre de cette méthode à l'appel.
Bonjour,
Je souhaite lancer des documents a partir de l'application (par exemple un manuel d'utilisation) ces documents sont présent dans le dossier du projet et s'ouvre bien sur mon pc mais lorsque je copie mon dossier de projet sur un autre pc, les document ne s'ouvre plus et pourtant je ne mets pas de chemin (comme ca l'application va chercher le document direct dans le dossier du projet)
Code:
1
2
3
4
5
6
7
8
9 void ouvrirFichier(String fichier){ try{ Desktop desk = Desktop.getDesktop(); desk.open(new File (fichier)); }catch(Exception e){ System.out.print(e); } }
Code:
1
2
3
4
5 @FXML private void actionManuelUse(){ String fichier="Manuel d'utilisation.docx"; inf.ouvrirFichier(fichier); }
On ne distribue pas un projet : un projet est un dossier d'élaboration de programme. Ce qu'on distribue, c'est le programme compilé et packagé, c'est le jar, ou quelque chose de préparé avec un logiciel dédié à la fabrication d'installables. Tu peux packager un ensemble de fichiers, par exemple dans un zip, que tu distribueras avec l'application (avec un jar, c'est compliqué, ça fait deux fichiers, il faut fournir des explications d'installation, tout ça, mais on peut le faire avec Java Web Start éventuellement). Le mieux est toujours d'intégrer ces ressources dans le jar distribuable. Le souci est que pour les ouvrir avec Desktop.open(), il faut que ça soit des fichiers. Solution : embarquer un zip des ces fichiers dans le jar, et déployer ce zip au premier lancement de l'application, dans Paths.get(System.getProperty("user.home")).resolve("myapplication/rsc") par exemple.
Bon, j'ai utiliser ce site https://netbeans.org/kb/docs/java/native_pkg.html#fx pour faire mon .exe (avec Inno Setup 5)
mais je ne peux même pas choisir l'icone qui sera mise et lorsque j'ai lancer le setup j'ai même pas pu choisir l'endroit ou j'installe l'appli...elle fonctionne mais par contre les fichiers extérieurs ne s'ouvre pas (ils ne sont même pas présent dans le dossier)
y a ce lien la qui correspond un peu a ce que je souhaite faire mais c'est avec eclipse : http://code.makery.ch/library/javafx...rial/fr/part7/
Bon au final, j'ai crée un exe avec launch4j puis j'ai utilisé InnoSetup et j'ai crée mon setup et l'ouverture des fichiers marche nikel :mouarf:
Merci beaucoup pour ton aide, mon projet est fini il ne me reste plus qu'a passer un oral dessus et puis c'est bon.
Hop je passe le sujet en résolu !