2016-04-29 18 views
6

Ich habe ein Hangman-Spiel gemacht, um mich selbst Java beizubringen. Ich habe den Hauptteil des Rahmens.Java Hangman Spiel Repaint() funktioniert nicht

this.add(new PaintSurface(), BorderLayout.CENTER); 

Ich habe:

private class PaintSurface extends JComponent { 
    Shape found = null; 

    public PaintSurface(){ 
     JOptionPane.showMessageDialog(null, "Repainting"); 
     Shape s; 
     msgbox("LL: " + intLivesLost); 
     switch(intLivesLost){ 
     //draw the Hanged man 
     case 10: 
      //Face + KILL 
     case 9: 
      //2nd Arm 
     case 8: 
      //1st Arm 
     case 7: 
      //2nd Leg 
     case 6: 
      //1st Leg 
     case 5: 
      //Body 
     case 4: 
      //Head 
      shapes.add(s); 
     case 3: 
      //Horizontal Bar 
      s = new Line2D.Float(100, 450, 250, 450); 
      shapes.add(s); 
      //Rope 
      s = new Line2D.Float(250, 450, 250, 500); 
      shapes.add(s); 
     case 2: 
      //Vertical Bar 
      s = new Line2D.Float(100, 450, 100, 670); 
      shapes.add(s); 
     case 1: 
      //Stand 
      s = new Line2D.Float(40, 670, 460, 670); 
      shapes.add(s); 
      break; 
     default: 
      break;   
     } 
    } 

    public void paint(Graphics g) { 
     Graphics2D g2 = (Graphics2D)g; 
     g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
       RenderingHints.VALUE_ANTIALIAS_ON); 
     g2.setStroke(new BasicStroke(4)); 
     g2.setColor(Color.BLACK); 

     for (Shape count : shapes){ 
      g2.draw(count); 
     } 
    } 
} 

Und ich bin mit:

repaint(); 

... während des gesamten Projekts jedes Mal, wenn der Rahmen aktualisiert wird, neue Buchstaben erraten, fehlerhafte denke, neues Spiel.

Wenn die Anwendung zuerst JOptionPane.showMessageDialog (null, "Repainting") ausgeführt wird; erscheint, also weiß ich, dass es dann genannt wurde. Danach erscheint das "Repainting" Pop-Up nicht mehr, daher weiß ich, dass das Repaint(); Anrufe tun nichts. Ich weiß, dass der Code zum Repaint() kommt; Anrufe, wie ich einen JOptionPane.showMessageDialog vor und nach ihnen gestellt habe.

Ich habe ohne Glück versucht:

removeAll();
revalidate();
getContentPane(). Repaint();

Alle Hinweise und Tipps dafür würden sehr geschätzt werden.

Edit: Ich habe es versucht, wie Sie empfehlen, setzen Sie den Code in "Farbe", denke, das ist, wie ich es vorher hatte, und es funktioniert immer noch nicht. Trotzdem danke.

+0

"public PaintSurface() {...}" ist der Konstruktor der PaintSurface-Klasse. Es wird nur aufgerufen, wenn PaintSurface mit "new PaintSurface()" erstellt wird. Deine Logik, um das Shapes-Objekt zu erstellen, sollte irgendwo anders sein (wahrscheinlich die Paint-Methode, aber ich bin mir nicht sicher, das ist also keine Antwort;)) –

Antwort

0

Ich habe es gelöst, legte die Zeichnung auf ein separates Panel, und das ist alles in Ordnung. Danke für die Hilfe.

1
  1. Überschreiben Sie nicht malen, override paintComponent oder aktualisieren Sie stattdessen nach Ihren Bedürfnissen.
  2. Scheint so, als ob Sie eine Verwirrung zwischen den Mal-, Repaint- und Update-Methoden haben. Lies dies: https://www.guiguan.net/repaint-paint-and-update/ Wenn du ein Spiel machst, wird repaint() das Repaint der gesamten Komponente verursachen, also wirst du einige Leistungsprobleme haben.