"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.
pouvez-vous expliquer plus clairement? – wangdq
D'où vient votre méthode 'renderLevelBackground()'?Veuillez fournir un code minimal pour l'analyser. – Braj