Fortlaufend in Java neu zeichnen

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

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 } 

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

    Cal Repaint von einem Swing Timer . Das wird die GUI nicht blockieren und wird in jedem im Timer angegebenen Intervall passieren. Aufgrund der Art des Swing / AWT-Malens kann es natürlich vorkommen, dass, wenn der Timer auf eine zu schnelle Wiederholung eingestellt ist, Aufrufe zu Malen verschmolzen (effektiv ignoriert) werden.

    Stellen Sie außerdem sicher, dass es sich bei der Methode um eine Überschreibung handelt:

     @Override public void paintComponent(Graphics g){ 

    Sie sollten eine Komponente nur dann neu zeichnen, wenn Sie sie benötigen (z. B. wenn Sie sie aktualisieren).

    Je nachdem, was du tust, interessiert dich das vielleicht auch. Dies stammt aus Killer Game Programming in Java von Andrew Davison. Er spricht über aktives Rendering . Deine Spielschleife ist effektiv:

     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) {;} } } 

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

     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) { ; } } 

    Von dem Buch:

    [Anmerkung 1] Der Aufruf von Tookkit.sync() stellt sicher, dass die Anzeige zeitnah aktualisiert wird. Dies ist für Linux erforderlich, das seinen Anzeigepuffer nicht automatisch löscht. Ohne den Aufruf sync() wird die Animation möglicherweise nur teilweise aktualisiert, wodurch ein “reißender” Effekt entsteht.

    Sie müssen Farbe (g) für einen schweren Behälter wie einen JFrame aufrufen. Sie rufen paintComponent (g) für leichte Container wie einen JButton auf. Schau, ob das funktioniert.