2013-04-02 4 views
0

Je travaille sur un programme qui va lire un dossier d'images dans un JList, et l'image sélectionnée dans le JList sera dessinée dans un JPanel. J'ai deux classes: ImageViewerPanel, qui crée le panneau pour afficher l'image sélectionnée. J'ai ensuite ImageViewerUI qui va dessiner le JList, et le ImageViewerPanel sera ajouté à la classe ImageViewerUI. Voici le code correspondant de la classe ImageViewerPanel.Problème de peinture BufferedImage

public ImageViewerPanel() { 
    initComponents(); 
} 

public void setImage(BufferedImage image) { 
    this.image = image; 
    repaint(); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    if (scaled == false) { 
     g.drawImage(image, 0, 0, null); 
    }else if(scaled == true) { 
     g.drawImage(image, 0, 0, 80, 80, null); 
    } 

Voici le code de la classe ImageViewerUI qui est de rafraîchir le panneau à l'image:

ImageViewerPanel imagePanel = new ImageViewerPanel(); 
    BufferedImage displayedImage; 
    BufferedImage originalImage; 

public ImageViewerUI() { 
    initComponents(); 
    loadListWithImageFilenames(); 
    updateImagePanel(); 
    updateThumbnailImagePanel(); 
} 

public final void updateImagePanel() { 
    try { 
     String currFile = (String) ("Images/" + imageList.getSelectedValue()); 
     displayedImage = ImageIO.read(new File(currFile)); 
     imagePanel.setImage(displayedImage); 
    } catch (IOException ex) { 
     Logger.getLogger(ImageViewerUI.class.getName()).log(Level.SEVERE, null, ex); 
    } 

public final void updateThumbnailImagePanel() { 
    try { 
     String currFile = (String) ("Images/" + imageList.getSelectedValue()); 
     originalImage = ImageIO.read(new File(currFile)); 
     imagePanel.setScaled(true); 
     imagePanel.setImage(originalImage); 
     imageViewerPanel1.add(imagePanel); 
     imagePanel.repaint(); 
    } catch (IOException ex) { 
     Logger.getLogger(ImageViewerUI.class.getName()).log(Level.SEVERE, null, ex); 
    } 

} 

La question que j'ai est que l'image ne soit pas affichée dans le panneau. Quelqu'un sait pourquoi?

+0

pour une meilleure aide plus tôt un post [SSCCE] (http://sscce.org/), court, runnable, compilable, [créer un BufferedImage à la volée] (http://stackoverflow.com/a/7944388/ 714968) – mKorbel

+0

Nous avons besoin d'un petit exemple de code exécutable complet pour vous aider. D'une part, cela ne semble pas avoir de sens: 'imageViewerPanel1.add (imagePanel);'. Pourquoi ajouteriez-vous le panneau d'image à la mise en page à chaque fois que la vignette est impalée? – Gene

+0

Si seulement quelqu'un pouvait trouver un moyen de rendre le code Swing court, autonome et exécutable. Le code exécutable peut être débogué en l'exécutant. –

Répondre

1
imageViewerPanel1.add(imagePanel); 
imagePanel.repaint(); 

Lorsque vous ajoutez des composants à une interface graphique visible le code doit être:

imageViewerPanel1.add(imagePanel); 
//imagePanel.repaint(); 
imageViewerPanel1.revalidate(); 
imageViewerPanel1.repaint(); 

Tous les composants sont créés avec une taille de (0, 0) donc il n'y a rien à peindre. Le revalidate() invoque le gestionnaire de disposition qui à son tour donne une taille au composant.

Comme mentionné ci-dessus, vous devrez également remplacer la méthode getPreferredSize() de votre imagePanel afin que le gestionnaire de disposition puisse déterminer la taille correcte du panneau.

+0

@DarthCthulhu puis d'utiliser 'CardLayout' au lieu de' container.revalidate() 'et' container.repaint() ' – mKorbel