Salut !
j'ai une question toute bete ..
comment afficher une image (un logo ici) dans ma fenetre swing ? :)
merci
Version imprimable
Salut !
j'ai une question toute bete ..
comment afficher une image (un logo ici) dans ma fenetre swing ? :)
merci
bonsoir,
Si c'est juste un logo, je pense que tu peux utiliser un JLabel:
sinon il y a pas mal de post là dessus je crois.Code:
1
2 new JLabel(new ImageIcon("chemin de l'image");
j'utilise le Gui Builder de Netbean donc je peut pas le mettre a l'initialisation .. par contre quand je fait ca j'ai une erreur :
Code:
1
2 C:\DEV\Java\Project\Osiris_Launcher\src\osiris_launcher\Launcher.java:52: setText(java.lang.String) in javax.swing.JLabel cannot be applied to (javax.swing.ImageIcon) jLabel1.setText(new ImageIcon("osiris_bg.jpg"));
Tu ne peut pas employer setText() pour afficher une icone sur un JLabel :roll:
Il te faut employer la méthode setIcon() pour mettre l'icone sur le JLabel ;)
l'image n'apparait pas :/Citation:
Envoyé par wichtounet
Code:
1
2
3
4
5 JLabel image = new JLabel(); image.setIcon(new ImageIcon("osirig_bg.jpg")); image.setSize(200,200); add(image);
ca devrait fonctionnait,l'image est dans le bon repertoire?
re à tous...
J'ai inséré une image de cette façon :
Question ou doit être l'image (quel répertoire) et comment le chemin doit être spécifié ?Code:
1
2
3
4
5
6
7
8
9
10 public void paintComponent(Graphics g) { Toolkit kit = Toolkit.getDefaultToolkit(); Image icone = kit.getImage("logo.jpg" ); g.drawImage(icone ,20, 20,221 ,131, null); }
et pour l'insérer au Panel ?? Parce que cela ne joue pas...Code:contentPane.add(image);
Avec NetBeans (peu importe la version), tu va dans le répertoire de ton projet qui contient les répertoires :
dist
build
src
nbproject
test
et tu y dépose ton image.
Ensuite, ta méthode "public void paintComponent(Graphics g)" doit être définie dans 1 JComponent. Cela signifie que lorsque la JVM (plus précisément le GUIManager il me semble) va vouloir afficher ton JComponent, il va faire appel à cette méthode et exécuter ce qu'elle contient. En l'occurence, elle va dessiner l'image dedans.
Il ne te reste plus ensuite qu'à déposer ce JComponent (dans ton cas, ce JComponent est un JPanel je crois :p) dans le Container de ton choix :
Code:maFrame.getContentPane().add(new MonJPanelPerso());
Je n'ai pas de classe Jcomponent ! :cry:
Ma frame s'appelle HelpAboutFrame et le panel c'est contentPane, donc cela donne :
Ou dois-je insére ce morceau de code ?Code:HelpAboutFrame.getContentPane().add(new contentPane());
Dis ... dans quelle classe as-tu définit la méthode paintComponent ?
tu dois faire :
Code:
1
2
3
4
5
6
7
8
9 public class maFrame extends JFrame{ //def de ta JFRame public maFrame(){ getContentPane().add(new JPanelPerso()); pack(); } }
voila .. normalement ça devrait faire ce que tu veux ... à moins que je ne me sois trompé ^^Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 public class JPanelPerso extends JPanel{ //def de ton JPanel public JPanelPerso (){ //trouver l'image } public paintComponent(Graphics g){ //ici tu met le code que tu as montré //et tu rajoute : setPrefferedSize(new Dimension(monImage.getWidth(), monImage.getHeight())); } }
Merci NeptuS pour ton aide ! Franchement c'est sympa de prendre du temps pour un newbie !
J'ai essayé de retranscrire ton code dans mon exemple mais je suis envahi d'erreurs de la part d'Eclipse... :cry:
Est-ce que j'ai mal retranscrit ?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 public HelpAboutFrame () { // Permet la gestion des événements graphiques. enableEvents (AWTEvent.WINDOW_EVENT_MASK); getContentPane().add(new JPanel()); jbInit (); } public JPanelPerso extends JPanel { public JPanelPerso() { } public void paintComponent(Graphics g) { Toolkit kit = Toolkit.getDefaultToolkit(); Image image = kit.getImage("logo.jpg" ); g.drawImage(image, 20, 20, 221 , 332, null); setPrefferedSize(new Dimension(Image.getWidth(), Image.getHeight())); } }
Je sais qu'avant d'être fort comme un chêne, il faut avoir été un gland. Un jour je serais un chêne et j'aiderais les glands comme moi ! :mouarf:
oui
1 - En java, (pour commencer tout du moins), on déclare une classe par fichier.
Le compilateur accepte en fait une classe publique par fichier (rien empêchant d'y déclarer des classes non publiques).
Bref, tout ça pour dire que tu dois déclarer "HelpAboutFrame" dans un fichier "HelpAboutFrame.java" et "JPanelPerso" dans "JPanelPerso.java".
C'est pour ça que j'avais séparé les 2 codes.
2 - "enableEvents (AWTEvent.WINDOW_EVENT_MASK);"
inconnu au bataillon .... et je ne crois pas que ce qoit la manière la plus propre ...
Perso, j'utilise setDefeultCloseOperation(EXIT_ON_CLOSE);
3 - "getContentPane().add(new JPanel());"
Ceci n'est pas faux en soi, mais ce n'est pas ce que tu veux faire. tu ne veux pas poser n'importe quel panel dans ta fenêtre : tu veux poser un JPanelPerso.
Tu remplace donc cette ligne par :
"getContentPane().add(new JPanelPerso ());"
4 - "setPrefferedSize(new Dimension(Image.getWidth(), Image.getHeight()));"
Une règle tacite de programmation objet est le nommage des variables :
"Une variable doit avoir un nom explicite. Elle ne débute jamais par une majuscule et prend une majuscule à chaque début de nouveau mot (par exemple : monSuperPanel). Seuls les nom de classe (et par extension : d'interface) commencent par une majuscule."
Ainsi : Image symbolise la classe Image et non pas un objet. L'objet que tu utilise (un objet est une instance d'une classe : un élément concret présent en mémoire et manipulable) s'appelle "image". Tu remplace donc cette ligne par :
"setPrefferedSize(new Dimension(image.getWidth(), image.getHeight()));"
Je te précise que tout ceci ne sont que des indications ... les paramètres des méthodes sont peut-être manquants ou les noms pas tout à fait bien orthographiés. De plus, avec NetBeans, tu a l'aide à la complétion (petite liste de choix du nom de la méthode ou de l'attribut que tu désire utiliser). Si elle n'apparaît pas, appuie sur Ctrl+Espace.
Ne code jamais en java sans avoir la doc de l'API d'ouverte :
http://java.sun.com/j2se/1.5.0/docs/api/
oulala merci NeptuS ! J'ai bien pris 20 min pour bien lire le message et tout comprendre !
Pour le point 1 - c'est vrai que j'avais du mal a comprendre le système de classe publique (j'en mettais 2 par fichier) ! le prob est reglé ! J'ai crée 2 classes !
Pour le point 2 - sur tes conseils je vais utiliser setDefeultCloseOperation(EXIT_ON_CLOSE);
Pour le point 3 - je me suis planté en recopiant ! Dsl je voulais mettre JPanelPerso...
Pour le point 4 - je fais tjs cette faute dans le variable et je me fais souvent tiré les oreilles... Mais le prob est réglé j'ai renommé mes variables...
Je vais essayer NetBeans car tout le monde en parle et je crois qu'il s'agit d'une référence pour Java...
Merci d'avoir pris le temps de me répondre... Je vais me pencher sur la Doc et les tutos du site avant de poster !
Voila je me suis baladé sur les FAQ mais je n'ai pas trouvé mon bonheur cependant j'ai pris bonne note !
J'ai crée une classe JPanelPerso.java
Cependant eclipse n'aime pas les méthode getHeight et getWidth, il me dit "The method getWidth(ImageObserver) int the type Image is not applicable for the arguments()" !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 import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import javax.swing.JPanel; public class JPanelPerso extends JPanel { private static final long serialVersionUID = 1L; public JPanelPerso() { } public void paintComponent (Graphics g) { Toolkit kit = Toolkit.getDefaultToolkit(); Image image = kit.getImage("logo.jpg"); g.drawImage(image, 100, 100, 221, 131, this); setPreferredSize(new Dimension(image.getHeight(), image.getWidth())); } }
et voici le morceau de code dans l'autre classe HelpAboutFrame :
J'ai du omettre la méthode pack(); car elle m'affichait le menu de mon application principale alors que j'en veux pas dans ma fenetre HelpAboutFrame...Code:
1
2
3
4
5
6
7
8
9
10
11 public HelpAboutFrame () { // Permet la gestion des événements graphiques. //enableEvents (AWTEvent.WINDOW_EVENT_MASK); setDefaultCloseOperation(EXIT_ON_CLOSE); getContentPane().add(new JPanelPerso()); jbInit (); }
Mon prob maintenant est que mon image ne s'affiche pas et je n'arrive pas résoudre les erreurs dans la classe JPanelPerso... :help:
ok, alors maintenant c'est la deuxième étape : les problèmes d'image. C'est extrêmement courant.
Utilise pour cela un objet de type ImageIcon.
J'ai fais un truc du genre mais sans succès :
Code:ImageIcon image = new ImageIcon("logo.jpg");
utilise plutot le constructeur :
c'est à dire :Code:ImageIcon(Image image)
Je ne suis pas sûr que ça fonctionne, mais essayeCode:
1
2
3
4
5
6
7
8
9
10 public void paintComponent (Graphics g) { ImageIcon icon = new ImageIcon getToolkit().getImage("logo.jpg"); g.drawImage(icon.getImage(), 100, 100, 221, 131, this); setPreferredSize(new Dimension(icon.getHeight(), icon.getWidth())); }
cherhce un peu pour les getWidth et getHeight ....
Bien vu j'ai inséré la deuxième partie du code que tu m'as donné mais getToolkit() me génère une erreur...
Par contre l'erreur que me générait getHeight et getWidth est réparée ! :lol: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 import java.awt.Dimension; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import javax.swing.Icon; import javax.swing.ImageIcon; import javax.swing.JPanel; public class JPanelPerso extends JPanel { private static final long serialVersionUID = 1L; public JPanelPerso() { } public void paintComponent (Graphics g) { Toolkit kit = Toolkit.getDefaultToolkit(); ImageIcon icon = new ImageIcon getToolkit().getImage("logo.jpg"); g.draw(icon.getImage(), 100, 100, 221, 131, this); setPreferredSize(new Dimension(icon.getIconHeight(), icon.getIconWidth())); } }
ben garde ton kit.getImage dans ce cas ...