2017-10-02 2 views
0

versuchen, ein Rechteck mit Farbe zu erstellen, aber Repaint-Methode ist kein Aufruf von Paint-Methode.Repaint-Methode nicht aufrufen Paint-Methode

sogar versucht, Farbe mit paintComponent zu ersetzen, aber immer noch nicht funktioniert. Was ändert sich also, damit es funktioniert? gibt es ein Problem mit dem Aufruf der Repaint-Methode im Lauf.

gibt es ein Problem mit der Instanz.

versuchen, ein Rechteck mit Farbe zu erstellen, aber Repaint-Methode ist nicht Aufruf von Paint-Methode.

sogar versucht, Farbe mit paintComponent zu ersetzen, aber immer noch nicht funktioniert. Was ändert sich also, damit es funktioniert? gibt es ein Problem mit dem Aufruf der Repaint-Methode im Lauf.

gibt es ein Problem mit der Instanz.

package src; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 


public class main extends JFrame implements Runnable{ 

private final int Height = 480; 
private final int Width = 640; 
Thread gameloop; 

public static main instance = null; 

private main(){ 

    JFrame frame = new JFrame(); 
    frame.setSize(this.Width,this.Height); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE); 
} 

public static main getInstance(){ 

    if (instance == null){ 

     instance = new main();} 
    return instance; 
} 

private void start(){ 

    gameloop = new Thread(this); 
    gameloop.start(); 

} 


@Override 
public void paint(Graphics g){ 

    Graphics2D g2d = (Graphics2D) g; 
    g2d.setColor(g2d.getBackground()); 
    g2d.fillRect(0, 0, instance.Width, instance.Height); 
    g2d.setColor(Color.red); 
    g2d.fillRect(0, 0, 50, 50); 

} 


@Override 
public void run() { 

    Thread current = Thread.currentThread(); 
    while (gameloop == current){ 
     try{ 
      Thread.sleep(5); 
     } 

     catch (InterruptedException e){ 
      e.printStackTrace(); 
     } 

     repaint(); 
    } 

} 



    public static void main(String[] args){ 

     main.getInstance(); 

     main.getInstance().start(); 
} 

}

+1

Befolgen Sie die Java-Namenskonventionen: 'ClassNames' beginnen mit Großbuchstaben,' variableNames' mit Kleinbuchstaben. Im Konstruktor Ihrer 'main' Klasse (sic!) Erstellen Sie einen ** neuen ** Rahmen. Entfernen Sie die Zeile 'JFrame frame = new JFrame()', und ändern Sie 'frame' in' this' in den folgenden Zeilen. Der Code ist immer noch schrecklich, aber .... – Marco13

+1

Rufen Sie die Methode nicht außerhalb des EDT. –

+1

Überschreibe 'Farbe' von Top-Level-Containern wie' JFrame' nicht, 'JFrame' enthält mindestens zwei andere Komponenten, die den Malprozess stören können – MadProgrammer

Antwort

0

Das ursprüngliche Problem war, dass Sie eine neue JFrame in Ihrem Konstruktor erstellt und machte dann das sichtbar, anstatt die main Instanz verwenden Sie gerade erstellt haben, so dass nichts in Ihrem main Klasse war eigentlich sein In Ihrer App wird nur ein leerer JFrame angezeigt, der nichts tut. Auch Ihre run Schleife ergab keinen Sinn.

Allerdings hat Ihr Code eine Los von anderen Problemen, sowohl in Logik und Stil. Ich würde Ihnen raten, einfach alles refaktorieren. Hier ist eine sauberere Version, die auch Ihr Problem löst.

package src; 

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import javax.swing.JFrame; 


public final class Main extends JFrame implements Runnable { 
    private volatile boolean running; 

    private Main(int width, int height) { 
     setSize(width, height); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
    } 

    private void start() { 
     running = true; 
     new Thread(this).start(); 
    } 

    private void stop() { 
     running = false; 
    } 

    @Override 
    public void paintComponent(Graphics g){ 
     Graphics2D g2d = (Graphics2D) g; 
     g2d.setColor(g2d.getBackground()); 
     g2d.fillRect(0, 0, getWidth(), getHeight()); 
     g2d.setColor(Color.red); 
     g2d.fillRect(0, 0, 50, 50); 
    } 

    @Override 
    public void run() { 
     while (running) { 
      try { 
       Thread.sleep(40); 
      } 
      catch (InterruptedException e){ 
       e.printStackTrace(); 
      } 
      repaint(); 
     } 
    } 

    public static void main(String[] args) { 
     new Main(640, 480).start(); 
    } 
} 
+0

Erweitern Sie 'JFrame' nicht und überschreiben Sie nicht' paint' (sondern nur 'paintComponent'). Das 'running' Flag muss" volatile "sein. Aber ... besser als die erste, sicher. – Marco13

+0

danke für die Einsicht. Ich lernte grundlegend (Art von ..) ein Spiel von hier aus zu machen: [link] (https://sites.google.com/site/javagamescorner/home/the-main-class), da wurde es so geschrieben. Ich habe den Code dort ausprobiert und es hat nicht für mich funktioniert. als ich den genauen Code kopiert habe, tat er, was passieren sollte (d. h. ein rotes Rechteck in der linken Ecke). Also, was ist das Problem damit? Danke trotzdem . –