2014-04-27 1 views
-1
private void renderLevelBackground(Graphics2D g2) { 
    Image backgroundImage = model.getBackgroundImage(); 

    g2.drawImage(backgroundImage, 0, 0, null); 
} 

Ceci est mon code, je sais que backgroundImage est chargé correctement parce que si je getWidth/Height, il me donne les bonnes valeurs. Est-il possible de tester si c'est l'image ou si c'est la méthode en quelque sorte? Je ne vais tout simplement pas dessiner sur mon écran malgré le fait que j'ai déjà utilisé la méthode drawImage plusieurs fois dans ce projet, qui fonctionne parfaitement.Y a-t-il une raison pour laquelle drawImage ne dessine pas réellement une image?

Merci

+0

pouvez-vous expliquer plus clairement? – wangdq

+0

D'où vient votre méthode 'renderLevelBackground()'?Veuillez fournir un code minimal pour l'analyser. – Braj

Répondre

3

"Y at-il jamais une raison drawImage puisera pas vraiment une image?"

Possibilité, il n'y a pas d'image en raison d'un mauvais chemin prévu. Utilisez ImageIO.read() qui provoquera une exception si le fichier image est introuvable. Par exemple

public class ImagePanel extends JPanel { 
    private BufferedImage image; 

    public ImagePanel() { 
     try { 
      image = ImageIO.read(getClass().getResource("/resources/image.png")); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

Si l'image n'est pas trouvée, une exception d'E/S est émise.


Possibilité, le panneau auquel vous dessinez, n'a pas de taille préférée (0 x 0), et vous ajoutez une mise en page de l'esprit conteneur qui respecte tailles préférées, de sorte que le ImagePanel ne sera pas en mesure pour montrer l'image. Par exemple

public class ImagePanel extends JPanel { 
    protected void paintComponent(...) { 
     ... 
} 

JPanel panel = new JPanel(); // default FlowLayout that respects preferred sizes 
panel.add(new ImagePanel()); 

Pour résoudre ce problème, vous pouvez remplacer le gerPreferredSize() du ImagePanel

public class ImagePanel extends JPanel { 
    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(300, 300); 
    } 
} 

Possibilité, vous n'êtes pas appeler votre méthode dans le contexte graphique de la méthode paint[Component].

protected void paintComponent(Graphics 2d) { 
    super.paintComponent(g); 
    Grapchics2D g2 = (Graphics2D)g; 
    renderLevelBackground(g2); 
} 

Autre que cela, ce sont tous juste devine, et vous devez fournir un peu plus code (de préférence un MCVE) pour nous aider à mieux aider vous le problème.


possible alternative à votre approche. Il semble que (à partir du petit extrait de code et de la sémantique de la signature de méthode) vous voulez changer l'image d'arrière-plan, quand un niveau a changé. Envisagez d'utiliser la méthode setBackgroundImage(BufferedImage image) dans votre classe de panneaux, lorsque l'image est dessinée. Vous pouvez ensuite définir l'arrière-plan, chaque fois que nécessaire. Quelque chose comme

public class BackgroundPanel extends JPanel { 
    private BufferedImage backgroundImage; 

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

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Grpahics2D g2 = (Graphics2D)g; 
     if (image != null) { 
      g2.drawImage(backgroundImage, 0, 0, this); 
     } 
    } 
} 

Donc chaque fois que vous appelez setBackgroundImage, l'image va changer, et être repeint.

+0

Une autre possibilité est que l'instance 'Graphics2D' possède une zone d'écrêtage et que l'image est positionnée en dehors de celle-ci. –

+0

@OlegEstekhin Oui, il existe de nombreuses possibilités. Je vais juste attendre pour voir un MCVE de l'OP :-) –

+0

J'ai compris que j'ai accidentellement oublié de ne pas dessiner l'image sur le BufferedImage. Donc j'utilisais juste une image buffered transparente avec les mêmes dimensions. J'apprécie l'aide et cette réponse devrait être particulièrement utile à tous ceux qui ont des problèmes avec quelque chose de similaire. Merci à tous! –

0

Vous devrez peut-être dire explicitement que le JComponent vous peignez sur qu'il doit être redessinée avec revalidate() et repaint()

Questions connexes