2010-02-06 5 views
3

J'essaye d'écrire une application où je veux ajouter différentes images sur un Jpanel. Tout fonctionne bien sauf pour le format JPG qui affiche des images de très mauvaise qualité. Voilà comment je fais le dessin:Images dans un JPanel

class draw extends Canvas 
{ 
    Dimension canvasSize = new Dimension(400, 400); 
    String fileName; 

    public void paint(Graphics g) 
    {  
     if(this.fileName!=null) 
     { 
      Toolkit toolkit = Toolkit.getDefaultToolkit(); 
      Image img = toolkit.getImage(fileName); 
      g.drawImage(img, 0, 0, this); 
     }     
    } 
    public void setFileName(String name) 
    { 
     this.fileName=name; 
    } 

    public Dimension getMinimumSize() 
    { 
     return canvasSize; 
    } 

    public Dimension getPreferredSize() 
    { 
     return canvasSize; 
    } 
} 

Est-il possible de telle sorte que le format JPG est couvert?

+0

Quelle est la taille de l'image JPEG que vous essayez d'afficher? 400 x 400 ... ou plus petit? – Adamski

Répondre

4

Ceci est probablement dû au fait que vous étirez (ou comprimez) l'image à la taille de la zone de travail. Les images JPEG ne sont pas très belles lorsque vous les mettez à l'échelle, en particulier si vous les agrandissez. Essayez une image de la même taille que (ou proche de) votre toile. Vous pouvez également obtenir la hauteur et la largeur du JPEG de la classe Image et l'afficher dans ses dimensions d'origine. Le tutoriel Drawing an Image de Sun montre comment faire.

+1

En outre, cet article par Chris Campbell est une ressource impressionnante pour la mise à l'échelle de l'image à la fois généralement et spécifiquement pour Java: http://today.java.net/pub/a/today/2007/04/03/perils-of-image- getscaledinstance.html – Ash

2

Le code affiché indique que l'OP est en train de peindre l'image à sa taille d'origine. Donc, mes commentaires sur le code:

a) Vous dites que vous voulez ajouter l'image à un JPanel, mais pour une raison quelconque vous étendez Canvas. Stick avec des composants Swing. Ensuite, si vous avez besoin de faire une peinture personnalisée, vous devez remplacer la méthode paintComponent() et non la méthode paint.

b) Lorsque vous utilisez une peinture personnalisée, vous ne devriez jamais lire l'image dans la méthode de peinture. Cette méthode peut être appelée plusieurs fois. Il est possible que l'image n'ait pas été complètement lue en mémoire. Je sais que Swing sera automatiquement repeint au fur et à mesure que l'image sera lue, je ne sais pas comment fonctionne AWT Canvas.

c) De même, lorsque vous surchargez des méthodes de peinture, n'oubliez pas d'appeler super.paint(), super.paintComponent() ou vous risquez d'obtenir des résultats inattendus. D) Cependant, en fonction du code affiché, il n'est même pas nécessaire de faire une peinture personnalisée (puisque vous dessinez l'image à sa taille réelle). Créez simplement un ImageIcon à partir de l'image et ajoutez l'icône à un JLabel. Ensuite, vous ajoutez simplement l'étiquette à l'interface graphique.

Je vous suggère de lire la section du tutoriel Swing sur How to Use Icons. Si la qualité de l'image est mauvaise, le problème est probablement lié à votre image, car vous utilisez maintenant du code standard, et non du code personnalisé.

+0

Merci, ça m'a aidé! –