-2
votes

Ajouter dynamiquement une image à Jlabel

Je tente d'ajouter de manière dynamique une image à mon jlabel, puis ajoutez le jlabel à mon panneau. Mon code ne jette aucune erreur, mais l'image n'est jamais affichée.

public JFrameGamePlay() {
initComponents();
JPanel leftpanel = new JPanel();
JPanel rightpanel = new JPanel();
JSplitPane pane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftpanel, rightpanel);

JLabel lblPlayer = new JLabel(new ImageIcon("/resources/__Image1.png"));
leftpanel.add(lblPlayer);
leftpanel.validate();
leftpanel.repaint();


10 commentaires

Si la réponse de Elliott ne résout pas votre problème, vous aurez besoin de poster un exemple de reproductible minimal Avec votre question, un petit programme compilable et runnable qui démontre votre problème pour nous. S'il vous plaît lire le lien. Utilisez également une image disponible en ligne pour faciliter les tests.


Appelez revalidate et repeindre sur pnlplayer


Ou mieux encore - avoir ce Jlabel déjà dans le Pnlplayer JPanel et remplissez-le initialement avec un imageicon qui contient une image vide, une taille de l'image du joueur.


@Madprogrammer - si j'ajoute pnlplayer.revalidate (); et pnlplayer.Repaint (); Toujours rien ne montre


@Doctorford Puis je suis d'accord avec Hovercraft, sans plus de contexte, il n'y a rien de plus que nous puissions faire pour vous


@Madprogrammer - Je modifie pour montrer mon constructeur complet. Y a-t-il un code supplémentaire que je puisse fournir à quiconque d'aider?


@Doctorford à une "conjecture continue", le gestionnaire de présentation a été utilisé (par NetBeans) est le génial grouplayout , qui est notoirement difficile à gérer, ou pire, il est défini sur "la disposition absolue", soit cas, ce sont des choix médiocres lorsque vous commencez.


@MadProgrammer - Oui, j'utilise Netbeans. Comment puis-je vérifier si c'est en fait grouplayout


@Doctorford Regardez l'éditeur de propriétés pour le composant. Une fois que vous avez fait cela, abandonnez l'éditeur de formulaire, ils ne sont que des ennuis lorsque vous ne comprenez pas complètement l'API


@MadProgrammer - En regardant les propriétés de mon JPanel Je ne vois rien qui montre grouplayout ... dans le code derrière puis-je modifier quelque chose d'autre qu'un grouplayout?


3 Réponses :


1
votes

Utilisez imageio.read (fichier) pour lire l'image . Comme, xxx


2 commentaires

Et bien sûr, mieux utiliser les ressources et non les fichiers, alors lorsque le programme de l'OP JAR ... 1+


Utiliser cette image sans image dans mon étiquette - même problème que ci-dessus



0
votes

Le nullpointException provient du getresource ("__ image1.png") retourner null car il n'a pas trouvé le fichier. Vous devez le préfixer avec l'emplacement de la classe de classe (après tout, le chargeur de classe charge le fichier). Par exemple. Si l'image est dans un répertoire res de votre pot (ou dans votre path): xxx

ou vous pouvez directement donner un chemin complet: < Pré> xxx

exemple: xxx


3 commentaires

L'image est dans mon dossier de ressources qui est un sous-dossier du dossier source. J'ai essayé de faire comme vous avez suggéré et faire /resources/__Image1.png mais j'ai toujours une exception null? Je modifie mon code pour lire Jlabel LBLLayer = New Jlabel (Nouvelle imageicon ("/ ressources / __ image1.png")); et il n'y a pas d'erreur jeté, mais l'image n'apparaît pas lorsque le formulaire charge


@Doctorford Utilisation Nouveau imageicon (class.getsource ("/ chemin / relatif / à / source / dossier /Image.png")) Pour charger à partir du mode de classe ou Nouvelle imageIcon ("/ complet / chemin / à / image.png ") pour charger à partir du disque dur. L'esprit que le chemin pourrait être sensible à la casse si vous exécutez des fenêtres. Si l'image est dans un sous-dossier du dossier source, alors nouveau jlabel (nouveau imageicon (jframegamePlay.class.getresource ("/ ressources / __ ima ge1.png"))) devrait fonctionner.


@Doctorford Essayez de copier-coller l'exemple que j'ai donné, cela fonctionne (au moins avec la deuxième image. Utilisez le chemin complet de vous __ image1.png au lieu du /Images/thewall.png j'ai utilisé).



0
votes

Mon code ne jette aucune erreur, mais l'image n'est jamais ajoutée.

Oui, c'est malheureusement comment fonctionne imageicon. Cela ne jette ni des exceptions ni rien s'il est incapable de lire dans le nom de fichier ou l'URL que vous y passez. Le code fonctionne sans erreur mais ne montre que rien.

playerimage = "/ utilisateurs / propriétaire / téléchargements / __ pikachu.png";

Si vous souhaitez lire à partir d'un fichier dans un endroit fixe comme celui-ci, il ne sera pas utile de gâcher avec getclassloader (). GetResource () . Cela pourrait être utile de lire un fichier image que vous emballer avec votre application, mais de ne pas lire une image dans le répertoire de base de l'utilisateur. Votre approche originale Nouvelle image IMAGEIGON (Imagélocation) est appropriée pour cela.

[Note: Je pense que c'est une bonne idée d'envoyer le nom de fichier (ou l'URL) directement à l'imageicon, comme votre code d'origine fait. D'autres réponses suggèrent imageIO.Read (), qui peut être utile pour voir où cela va mal, mais vous pouvez le changer de imageicon (Filenameorurl) une fois que vous l'avez obtenu. Mais ce n'est pas une grosse affaire.]

Je tente d'ajouter de manière dynamique une image à mon jlabel, puis ajoutez le jlabel à mon panneau.

Si par "Dynamiquement", vous voulez le faire lorsque certains événements se produisent, une fois que le panneau est déjà visible à l'écran, je suggère pas faire cela.

c'est-à-dire, au lieu de faire cela ... xxx

... Vous pouvez ajouter le jlabel à votre panneau (invisible car aucun texte ou image) à la même Démarrez, avant que votre panneau soit affiché à l'écran. Ensuite, dynamiquement ajoutez l'imageicon au jlabel déjà existant. Tout ce que vous avez besoin d'appeler est existantLabel.Seticon (...) . Il n'y aurait pas besoin d'appeler valider () ou repeindre ().


5 commentaires

J'aime cette approche. Comment pourrais-je définir une image de mon dossier de ressources pour être SETICON? Lorsque j'essaie d'obtenir une erreur de compilation de l'URL ne peut pas être convertie en icône. Ceci est ma syntaxe lblPlayer.seticon (getclass (). GetClassloader (). GetResource ("/ ressources / __ pikachu. png");


Devrait faire quelque chose comme LBLLayer.Seticon ( Nouveau Imagaicon ( GetClass (). GetClassloader (). GetResource ("/ Ressources / __ pikach u.png"))));


Qui supprime l'erreur de compilation - mais je reçois une erreur de débogage d'exception dans le fil "AWT-EventQuue-0" Java.lang.nullPointereException


Eh bien, nous devons tous faire déboguer NullPointerException un jour. Le message d'exception aurait dû vous donner un numéro de ligne pour vous aider à le suivre. Une chose que vous pourriez essayer est lblplayer.seticon (nouveau ballicion (60, java.awt.color.orange)) et voir si le label Stuff fonctionne séparé de la truc de chargement de l'image. Ballicon.java Source


C'est pastebin de ma toute erreur - pouvez-vous m'aider à le suivre? Il répertorie plusieurs numéros de ligne Pastebin.com/12Scyeq7