Mise à jour d'une image contenue dans un JLabel - problèmes
La partie de l'application que je suis en train de la difficulté à se rendre au travail est d'être capable de faire défiler et afficher une liste d'images, une à la fois. Je suis un répertoire de l'utilisateur, de bobinage, par le biais de tous les fichiers dans ce répertoire, puis de le charger un tableau de seulement le jpeg et png. Ensuite, je veux mettre à jour un JLabel avec la première image, et de fournir les boutons précédent et suivant pour faire défiler et afficher chaque image à son tour. Lorsque j'essaie d'afficher la deuxième image, il n'est pas mis à jour... Voici ce que j'ai obtenu jusqu'à présent:
public class CreateGallery
{
private JLabel swingImage;
La méthode que j'utilise pour mettre à jour l'image:
protected void updateImage(String name)
{
BufferedImage image = null;
Image scaledImage = null;
JLabel tempImage;
try
{
image = ImageIO.read(new File(name));
} catch (IOException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
//getScaledImage returns an Image that's been resized proportionally to my thumbnail constraints
scaledImage = getScaledImage(image, THUMB_SIZE_X, THUMB_SIZE_Y);
tempImage = new JLabel(new ImageIcon(scaledImage));
swingImage = tempImage;
}
Ensuite dans mon createAndShowGUI méthode qui met l'swingImage sur...
private void createAndShowGUI()
{
//Create and set up the window.
final JFrame frame = new JFrame();
//Miscellaneous code in here - removed for brevity
// Create the Image Thumbnail swingImage and start up with a default image
swingImage = new JLabel();
String rootPath = new java.io.File("").getAbsolutePath();
updateImage(rootPath + "/images/default.jpg");
//Miscellaneous code in here - removed for brevity
rightPane.add(swingImage, BorderLayout.PAGE_START);
frame.add(rightPane, BorderLayout.LINE_END);
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
UIManager.put("swing.boldMetal", Boolean.FALSE);
new CreateGalleryXML().createAndShowGUI();
}
});
}
Si vous êtes arrivé jusqu'ici, la première image est mon default.jpg et une fois que je reçois le répertoire et d'identifier la première image dans ce répertoire, c'est là où il échoue lorsque j'essaie de mettre à jour le swingImage. Maintenant, j'ai essayé de swingImage.setVisible() et swingImage.revalidate() pour essayer de le forcer à recharger. Je devine que c'est mon tempImage = new JLabel qui est la cause de racine. Mais je ne suis pas sûr de savoir comment convertir mes BufferedImage ou une Image à un JLabel dans le but de simplement mettre à jour swingImage.
setVisible()/revalidate()
appels a jamais travaillé dans cette situation. J'espère que ça va mettre un peu de lumière sur l'ensemble de ce truc un peu plus, pourquoi vous obtenir ce comportement inattendu 🙂J'avais essayé différentes combinaisons de setVisible(false) avant que le paramètre de retour à la réalité après la swingImage = tempImage; et j'ai aussi essayé de l'utiliser .revalidate() avant et après le setVisible(true). Mais je commence à croire que c'est le new JLabel(new ImageIcon(scaledImage) qui est à l'origine du problème... Encore en train de regarder et d'essayer de comprendre....
OriginalL'auteur Osh | 2012-04-07
Vous devez vous connecter pour publier un commentaire.
Au lieu de créer un
New Instance
de laJLabel
pour chaqueImage
, il suffit d'utiliser JLabel#setIcon(...) méthode de laJLabel
pour modifier l'image.Un petit exemple de programme :
Depuis vous de le faire avec ImageIO, voici un bon exemple en ce qui concerne que JLabel à l'aide de ImageIO
Informations relatives à votre cas, de ce qui se passe :
À l'intérieur de votre
createAndShowGUI()
de la méthode d'initialisation de votreJLabel
(swingImage), et que vous avez ajouté à votreJPanel
en vertu de laquelle indirectement à laJFrame
.Mais maintenant, à l'intérieur de votre
updateImage()
méthode, vous êtes à l'initialisation d'un nouveauJLabel
, maintenant il réside dans un autre emplacement mémoire, par écrittempImage = new JLabel(new ImageIcon(scaledImage));
et après cela, vous pointant votreswingImage(JLabel)
au point de ce nouveauJLabel
, mais ce nouvellement crééJLabel
n'a jamais été ajoutées à laJPanel
, à tout moment. Par conséquent, il ne sera pas visible, même si vous essayezrevalidate()/repaint()/setVisible(...)
. Donc soit vous modifiez le code pour votreupdateImage(...)
méthode pour cela :Ou d'utiliser
JLabel.setIcon(...)
comme mentionné plus tôt 🙂MISE À JOUR DE LA RÉPONSE
Ici de voir comment un
New JLabel
est placé à la position de l'ancien,Et pour votre Question : Des deux options que j'ai essayé, est-ce mieux que les autres?
setIcon(...)
a un bord sur l'autre, dans le sens, vous n'avez pas à vous soucier de la revalidate()/repaint() thingy après l'ajout/suppression deJLabel
. En outre, vous n'avez pas besoin de vous souvenir de l'emplacement de votreJLabel
à chaque fois, vous l'ajoutez. Il reste à son poste, et il vous suffit d'appeler une méthode pour modifier l'image, pas de cordes attachées et le travail est fait, sans maux de tête.Et pour la Question 2 : j'ai eu un peu de doute, ce qui est
Array of Records
?Merci, pour ça :-), Vous avez eu un exemple pour chaque situation, aucun doute à ce sujet aujourd'hui, hehe 🙂
Merci belle vache! Votre swingImage.setIcon(icône) solution a fonctionné... j'ai envie de regarder votre remanié updateImage méthode et de voir comment cela fonctionne, et aussi regarder @trashgod du lien. Encore une fois, les deux vous m'avez aidé!
vache pas, j'ai sans fin fortunas que il y a des top 10, qui m'aident comme nous l'essayer pour en aider un autre ....
Oui, c'est vrai, si vous trouvez que la réponse se tient bien à vos attentes, vous pouvez le marquer comme correcte, comme il est expliqué ici, ou si la dite réponse vient de votre côté, vous pouvez poster votre propre réponse et marquer correcte, les deux manières de fermer le thread en cours, et d'aider les futurs visiteurs d'obtenir de l'aide 🙂
OriginalL'auteur nIcE cOw