2016-08-26 3 views
1

Tout d'abord, s'il vous plaît ne me gravez pas au bûcher pour créer une question alors que d'autres avec des noms et des contenus similaires existent. J'ai regardé à travers eux tous, mais n'a trouvé aucune solution. Appeler repaint() n'appelle absolument pas paintComponent(), peu importe ce que j'ai l'air d'essayer. Voici tout le code lié au problème:repaint() n'appelle pas paintComponent()

@Override 
    public void mouseClicked(MouseEvent e) {//User clicks on play button, creates a new Level object. Level extends JPanel. 
    if(isOnPlayButton(e.getPoint())){ 
     GameState.setState(GameState.INGAME); 
     Level l = new Level(2); 
     l.setVisible(true); 
     Tetris.getWindow().setContentPane(l); 
     Soundtrack.updateAudio(); 
     System.out.println("Level panel created and content pane set"); 
    } 
    } 

Comme prévu, « panneau de niveau créé et jeu de volet contenu » est imprimé à la console.

@SuppressWarnings("serial") 
public class Level extends JPanel implements ActionListener{ 

    private final int levelNum; 

    public Level(int levelNum){ 
    this.levelNum = levelNum; 

    this.repaint();//Although this should work in the constructor, how about a Timer that repaints for confirmation? 
    new Timer(2*1000, this).start(); 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
    super.paintComponent(g); 
    g.drawImage(Tetris.getTexture("LevelBackdrop.png"), 0, 0, null); 
    System.out.println("paintComponent - level painted"); 
    g.setColor(new Color(255, 255, 0)); 
    g.drawString("2", 355, 55); 
    } 

    public int getLevelNum() { 
    return levelNum; 
    } 

    public double getGravity(){ 
    return levelNum/4; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    this.repaint(); 
    System.out.println("Timer repainting"); 
    } 

} 

"paintComponent - niveau peint" n'est jamais imprimé. Le "repeindre minuterie" s'imprime toutes les 2 secondes, comme prévu.

+0

pouvez-vous simplement supprimer le minuteur l'essayer, et retirer ce repaint() du constructeur de niveau – whyn0t

+0

Je suggère Swingworkers: http://stackoverflow.com/questions/782265/how-do-i-use-swingworker-in -java –

+3

Je recommande de poster un [mcve]. Comme c'est actuellement, on ne peut pas reproduire ce que vous vivez et il ne semble pas y avoir quelque chose d'évident (du moins ce que je vois) du code affiché. – copeg

Répondre

4

Quelle est la taille réelle de l'objet level lorsque la peinture est appelée? Si la hauteur et la largeur sont nulles, la méthode paintComponent ne sera pas appelée. Puisque vous n'appelez jamais setPreferredSize(...), je pense que cela pourrait être la raison. Si ceci ne résout pas votre problème, écrasez la repaint() méthode dans Level et mettez en pause pour voir ce qu'il fait réellement (nécessite installation de JDK).

+0

Si vous avez une question, posez-la dans les commentaires. Ne postez pas de questions en guise de réponse. – user1803551

+0

Je pense que vous avez raison. C'est peut-être le problème. Près de mon appel à repaint(), j'ai fait "System.out.println (this.getSize(). GetWidth() +": "+ this.getSize(). GetHeight());" Et à la fois la largeur et la hauteur sont à 0.0 Malheureusement, setPrefferedSize() ne fait rien pour résoudre ce problème. – HelpMe

+0

J'ai utilisé setSize() et cela a fonctionné! MERCI BEAUCOUP =) – HelpMe