Ajouter une image sur une fenêtre

Fermé
Maximims Messages postés 227 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 23 février 2021 - 23 mai 2018 à 11:06
Maximims Messages postés 227 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 23 février 2021 - 1 juin 2018 à 11:01
Bonjour,

Je réalise un petit projet qui consiste à réaliser un petit logiciel affichant plusieurs informations concernant les éléments du tableau périodique codé en Java.

Pour le moment, j'ai simplement crée une fenêtre avec un menu déroulant permettant de choisir son matériau, j'ai également inséré des String (pour les caractéristiques de bases: numéro atomique, etc....)

J'aimerais (si cela est possible) insérer une image de l'élément (du moins une image de sa représentation atomique), mais je n'y parviens pas. J'essaye d'utiliser la fonction g.drawImage en mettant mon image hydrogen.jpg dans mon dossier src du projet mais pas moyen.

Merci d'avance, un débutant :)

A voir également:

2 réponses

KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018
23 mai 2018 à 11:23
Bonjour,

Cela dépend de quels outils tu utilises pour compiler.

En général tu as deux dossiers :
src
pour les .java et
bin
pour les .class
Le programme s'exécute à partir des .class donc les images devraient plutôt être dans
bin
pas dans
src
.
2
Maximims Messages postés 227 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 23 février 2021 68
Modifié le 25 mai 2018 à 08:34
Bonsoir,

Merci pour ta réponse, j'utilise le logiciel Eclipse (je ne sais pas si c'est le meilleur mais bon...)

private void draw(Graphics g) throws IOException{      
    if(this.forme.equals("Hydrogen")){
      g.drawString("HYDROGEN CHARACTERISTICS",400, 20);
      g.drawString("Atomic number: 1", 10, 40);
      g.drawString("Atomic mass: 1", 10, 60);
      g.drawString("Natural state: gaseous", 10, 80);
      g.drawString("Melting point: 259.1°C", 10, 100);
      g.drawString("Boiling point: 252.9°C", 10, 120);

      Image img = ImageIO.read(new File("hydrogen.jpg"));
      g.drawImage(img, 0, 0, this);

      }
  }


Voilà, par exemple, en ajoutant ma photo dans bin, j'obtiens toujours des erreurs dans la console, en fait je ne sais pas si on peut assigner à g une chaîne de caractères et ensuite une image afin de les afficher tous les 2.

Mon but serait d'ajouter le plus d'informations possibles sur chaque fenêtre de matériau et des images pourraient rendre le logiciel un peu plus attrayant et coloré...

Merci d'avance!

Je drop quand même les erreurs obtenues peut-être qu'elles pourront servir :

at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1301)
at projetJava.Panneau.draw(Panneau.java:45)
at projetJava.Panneau.paintComponent(Panneau.java:31)
at javax.swing.JComponent.paint(JComponent.java:1056)
at javax.swing.JComponent.paintToOffscreen(JComponent.java:5210)
at javax.swing.RepaintManager$PaintManager.paintDoubleBuffered(RepaintManager.java:1579)
at javax.swing.RepaintManager$PaintManager.paint(RepaintManager.java:1502)
at javax.swing.RepaintManager.paint(RepaintManager.java:1272)
at javax.swing.JComponent._paintImmediately(JComponent.java:5158)
at javax.swing.JComponent.paintImmediately(JComponent.java:4969)
at javax.swing.RepaintManager$4.run(RepaintManager.java:831)
at javax.swing.RepaintManager$4.run(RepaintManager.java:814)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:814)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:789)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:738)
at javax.swing.RepaintManager.access$1200(RepaintManager.java:64)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1732)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
at java.awt.EventQueue.access$500(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:709)
at java.awt.EventQueue$3.run(EventQueue.java:703)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:80)
0
Maximims Messages postés 227 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 23 février 2021 68
25 mai 2018 à 01:48
Après quelques recherches j'ai finalement réussi à ajouter une image en indiquant directement son chemin.

Autre petite question: puis-je "appeler" l'image d'une autre manière car si je change de machine, mon image ne sera plus au même chemin d'accès. Merci à toi!
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018 > Maximims Messages postés 227 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 23 février 2021
25 mai 2018 à 08:50
ImageIO.read(new File("hydrogen.jpg"));
va lire un fichier en chemin relatif par rapport à l'endroit où tu as lancé le programme.
Le mieux serait plutôt d'utiliser le classloader, avec un chemin relatif au classpath du programme (les .class etc)

Remarque : il n'y a pas de raison d'aller lire l'image à chaque fois que tu fais le draw, une seule fois devrait suffire.

private Map<String, Image> cache = new WeakHashMap<>();

private void draw(Graphics g) throws IOException{      
    if (forme.equals("Hydrogen")){
      g.drawString("HYDROGEN CHARACTERISTICS",400, 20);
      g.drawString("Atomic number: 1", 10, 40);
      g.drawString("Atomic mass: 1", 10, 60);
      g.drawString("Natural state: gaseous", 10, 80);
      g.drawString("Melting point: 259.1°C", 10, 100);
      g.drawString("Boiling point: 252.9°C", 10, 120);

      Image img = cache.get("Hydrogen");
      if (img == null) {
          img = ImageIO.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("hydrogen.jpg"));
          cache.put("Hydrogen", img);
      }

      g.drawImage(img, 0, 0, this);
  }

Remarque : au vu des informations que tu affiches, il serait sûrement astucieux d'utiliser un enum pour tes différents éléments périodiques et/ou un fichier texte pour leurs détails.
0
Maximims Messages postés 227 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 23 février 2021 68
25 mai 2018 à 10:13
Merci beaucoup pour tes réponses ça m'aide énormément!

Je me permets de te demander une petite chose, afin de rendre un peu plus professionnel mon programme j'aimerais rajouter une partie login/register dès le lancement du programme afin d'autoriser seulement des personnes identifiés (pour mettre ce programme à disposition de mon école d'ingénieur).

J'ai demandé de l'aide à un professeur, il m'a indiqué qu'il fallait simplement créer une fenêtre qui autorise l'accès à mon autre fenêtre (celle qui affiche les caractéristiques des matériaux). Étant débutant dans le domaine, je ne sais pas du tout comment y parvenir, merci à toi!
0
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 3 018 > Maximims Messages postés 227 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 23 février 2021
25 mai 2018 à 13:39
Actuellement tu dois probablement avoir une JFrame dont tu fais un setVisible(true);

Mais il est tout à fait envisageable de mettre du code avant cet affichage, par exemple afficher une autre fenêtre, voire juste une pop-up : https://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

Et de n'afficher ta fenêtre principale que si tu as satisfait aux conditions d'identifications précédentes.

Exemple :

boolean authorized = askCredentials();
if (authorized) {
    displayMainFrame();
}

Remarque : Je pense que le plus simple est d'avoir un seul compte et mot de passe pour toute l'application (tous les utilisateurs auront le même). Sinon après il te faudra une base de données pour gérer ceux qui sont autorisés.
0
Maximims Messages postés 227 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 23 février 2021 68
30 mai 2018 à 10:49
Salut, j'ai crée des pop-ups afin de demander l'accès à la fenêtre suivante mais je ne comprends pas pourquoi j'obtiens une erreur avec ce while..

Pourrais-tu m'éclairer?

JOptionPane acces = new JOptionPane();


Object password1 = null;
Object username = null;

while (!username.equals("XXXX") && !password1.equals("xxxx")) {
String username = acces.showInputDialog(null, "Veuillez entrer votre identifiant", "Material database comparison", JOptionPane.QUESTION_MESSAGE);
String password1 = acces.showInputDialog(null, "Veuillez entrer votre password", "Material database comparison", JOptionPane.QUESTION_MESSAGE);


}
0