2017-06-11 5 views
0

J'essaie de m'habituer à utiliser la méthode paintComponent() avant de l'intégrer dans mon programme. Cependant, chaque fois que j'essaie de dessiner une image sur le JPanel, cela ne fonctionne pas. J'ai mis le code ci-dessous. Toute aide serait appréciée. Merci.La méthode paintComponent ne dessine pas l'image

public class ExperimentGame extends JPanel{ 

Image image; 

public ExperimentGame(){ 
    JFrame frame = new JFrame(); 
    SwingUtilities.isEventDispatchThread(); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.add(this); 
    frame.pack(); 
    frame.setSize(500,500); //my edit 
    this.setBackground(Color.WHITE); 
    frame.setVisible(true); 
    try { 
     image = ImageIO.read(this.getClass().getResource("spaceship (0).png")); 
    } 
    catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.drawImage(image, 50, 50, null); 
} 
} 

public class ExperimentMain { 

public static void main(String[] args) { 
    ExperimentGame game = new ExperimentGame(); 
} 
} 

Répondre

0

Un petit problème pour résoudre votre problème est d'appeler au bas de votre constructeur.

this.revalidate(); 
this.repaint(); 

Cependant, je vous recommande de jeter un oeil comment Model-View-Controller peut être utilisé pour mettre à jour votre point de vue chaque fois que quelque chose a changé dans votre modèle. Un exemple peut être trouvé here.

+0

Pourquoi est-ce que dans tous les didacticiels que j'ai examinés, ils n'utilisent pas les lignes de code que vous suggérez et pourtant leur programme fonctionne bien? – jmao

+0

Cela a fonctionné, mais d'après ce que je comprends, cela ne devrait pas être nécessaire d'ajouter. – jmao

+0

@jmao Ces lignes ne devraient pas être nécessaires. Si leur ajout fait une différence, vous devez probablement obéir aux [règles de threading Swing] (http://docs.oracle.com/javase/tutorial/uiswing/concurrency/) et changer votre méthode 'main' en' EventQueue.invokeLater (() -> new ExperimentGame()); ', qui force votre code à s'exécuter dans le thread d'envoi d'événement AWT. – VGR