Frage an swing, multithreading, paint, java – Kontinuierliches Repainting in Java

1

Ich habe ein Java-Programm, das Threads verwendet. In meiner Run-Methode habe ich:

<code>public void run() {
    while(thread != null){
        repaint();
        System.out.println("hi");
        try {  
            Thread.sleep(1000);  
        } catch (InterruptedException e) {  
            break;  
        }  
    }
}

public void paintComponent(Graphics g) {
    // painting stuff
}
</code>

Das Problem ist, dass die run-Methode ausgeführt wird, aber diepaintComponent Abschnitt wird nicht aufgerufen. Wenn dies nicht der richtige Weg ist, um die Komponente weiter neu zu lackieren, wie soll ich sie dann neu lackieren?

Bitte zeigen Sie uns echten Code mit anständiger Formatierung. Ihr aktueller Code schlägt vor, dass paintComponent istinnerhalb die run () Methode und das kann nicht wahr sein. Bearbeiten Sie also erneut Ihre Frage, bereinigen Sie Ihren Code so weit wie möglich und geben Sie eine sinnvolle Postleitzahl an, den Code, den Sie gerade verwenden, und geben Sie uns weitere Details zu Ihrem Problem. Angenommen, wir wissen nichts über nicht angezeigten Code und können Ihre Gedanken nicht lesen. Hovercraft Full Of Eels
Befindet sich dieser Codeblock in einer Klasse, die a erweitert?JComponent? (dapaintComponent() ist einJComponent Methode). cgull
Probieren Sie es ausBeispiel, Hoffentlich kann das helfen :-) nIcE cOw

Deine Antwort

4   die antwort
3

wenn dies erforderlich ist (dh wenn Sie sie aktualisieren).

@ Anonymous181: "funktioniert nicht" sagt uns nichts, was wir nutzen können, um Ihnen zu helfen. Bitte bearbeiten Sie Ihre Frage und erwägen Sie, genügend Informationen zu veröffentlichen, damit wir Ihr Problem besser verstehen können. Hovercraft Full Of Eels
Denken Sie daran, dass das System keine Aktualisierung durchführen kann, wenn Sie im UI-Thread schlafen. Hot Licks
@ Anonymous181 Wenn sich nichts geändert hat, muss der Bildschirm nicht aktualisiert werden. Wann immer Sie den Spielstatus aktualisieren, sollten Sie Ihre Komponente anweisen, sich neu zu malen. Jeffrey
Aber in einem Spiel muss ich den Bildschirm ständig aktualisieren. Anonymous181
1

was Sie gerade tun, könnte Sie dies auch interessieren. Dies ist entnommen ausKiller Game Programming in Java von Andrew Davison. Er redet überaktives Rendern. Ihre Spielrunde ist effektiv:

<code>public void run()
{
  while (running)
  {
    gameUpdate();                             // game state is updated
    gameRender();                             // render to a buffer
    paintScreen();                            // draw buffer to screen

    try
    {
      Thread.sleep(20);
    }
    catch (InterruptedException e) {;}
  }
}
</code>

Und die Implementierung von Paint Screen ist (definiert durch eine Unterklasse vonJComponent):

<code>private void paintScreen()
{
  final Graphics2D g2d;

  try
  {
    g2d = (Graphics2D) this.getGraphics();
    if (g2d != null && (backbuffer != null))
    {
      g2d.drawImage(backbuffer, 0, 0, null);
    }

    Toolkit.getDefaultToolkit().sync();       // sync the display on some systems [1]
    g2d.dispose();
  }
  catch (Exception e)
  {
    ;
  }
}
</code>

Von dem Buch:

[Anmerkung 1] Der Anruf nachTookkit.sync() sorgt dafür, dass die Anzeige zeitnah aktualisiert wird. Dies ist für Linux erforderlich, das den Anzeigepuffer nicht automatisch leert. Ohne dassync() Aufruf kann die Animation nur teilweise aktualisiert werden, wodurch ein "Aufreiß" -Effekt entsteht.

0

rufen. Sie rufen paintComponent (g) für leichte Container wie einen JButton auf. Sehen Sie, ob das funktioniert.

5

Timer. Dies blockiert die GUI nicht und geschieht in jedem Intervall, das im Timer angegeben ist. Natürlich können aufgrund der Art des Swing / AWT-Malens Aufrufe zum Malen zusammengeführt werden (effektiv ignoriert werden), wenn der Timer zu schnell wiederholt wird.

Stellen Sie außerdem die Methode sicherist ein Override mit:

<code>@Override
public void paintComponent(Graphics g){
</code>

Verwandte Fragen