2009-03-02 6 views
1

Ok, maintenant j'utilise drawImage en Java depuis un moment, et cela n'est jamais arrivé auparavant. Pourquoi ne trouve-t-il pas "drawImage(java.awt.image.BufferedImage,<nulltype>,int,int)" dans mon code?"ne peut pas trouver la méthode de symbole drawImage (java.awt.image.BufferedImage, <nulltype>, int, int)"

 
import java.awt.*; 
import javax.swing.*; 
import javax.swing.JPanel; 
import java.awt.event.*; 
import java.awt.image.*;  
import java.io.*; 
import java.util.Arrays; 
import javax.imageio.ImageIO; 

public class imgtest extends JFrame{ 
    BufferedImage img; 
    Graphics g2d; 
    /** 
    * Creates a new instance of imgtest. 
    */ 
    public imgtest() { 
     File file = new File("test.png"); 
     img = ImageIO.read(file); 
    } 

    /** 
    * @param args the command line arguments 
    */ 
    public void paint(Graphics g) 
    { 
     g2d = (Graphics2D)g; 
     g2d.drawImage(img, null, 0, 0); 
    } 

    public static void main(String[] args) { 
     imgtest i = new imgtest(); 
     i.setSize(640,480); 
     i.setVisible(true); 
     i.repaint(); 
     // TODO code application logic here 
    } 
} 

Répondre

4

Vous avez déclaré g2d comme un objet Graphics et Graphics n'a pas la méthode drawImage(BufferedImage, BufferedImageOp, int, int). Correction: remplacer la ligne

Graphics g2d; 

avec

Graphics2D g2d; 

Lorsque Java est à la recherche pour les attributs d'un objet qui est stocké dans une variable comme celui-ci, il utilise toujours le type déclaré de la variable, à savoir Graphics. Le fait que vous ayez casté g en Graphics2D ne fait pas de différence, sauf si vous le stockez dans une variable de type Graphics2D.

0

Vous avez déclaré g2d comme Graphics et non un objet Grahphcs2d

Tenir compte soit en changeant l'appel de méthode de

g2d.drawImage(img, null, 0, 0); 

à

(Graphics2d) g2d.drawImage(img, null, 0, 0); 

ou modifier votre définition graphique comme David envoyer

1

Avec ce que d'autres ont dit à propos de la nécessité de décaler, il s'agit d'un Graphics2D, sortez-le des variables d'instance et en faire une variable locale. Il ne sert à rien d'avoir une variable d'instance qui est utilisée dans une seule méthode et a toujours la valeur overwitten chaque fois que cette méthode est appelée. Les variables d'instance sont utilisées pour conserver l'état entre les appels de méthode ... vous ne le faites pas ici.

public void paint(Graphics g) 
{ 
    final Graphics2D g2d; 

    g2d = (Graphics2D)g; 
    g2d.drawImage(img, null, 0, 0); 
} 
+0

il pourrait faire plus que ce qui est indiqué dans l'extrait de code;) – hhafez

+0

Dans mon expérience, plus souvent qu'autrement, ce n'est pas le cas malheureusement. – TofuBeer

Questions connexes