为什么Java重绘()方法不重绘?我的代码是合适的

问题描述:

我从2008 Java Book(Java Heads First)中提取了这段代码。并在同一时间提取其他代码。一个在工作,另一个不在。两者都在动画中使用repaint()方法。我非常仔细地比较了两个代码,它们是相同的!我不知道为什么这个代码不会重绘自己......只有当我最小化和最大化时,它才重绘,但不是在for循环中。我会告诉你这个代码不工作。感谢您的任何意见。为什么Java重绘()方法不重绘?我的代码是合适的

代码:

import javax.swing.*; 
import java.awt.*; 

public class ProstaAnimacja { 

    int x = 70; 
    int y = 70; 

    public static void main(String[] args) { 
    ProstaAnimacja gui = new ProstaAnimacja(); 
    gui.doRoboty(); 
    } 

    public void doRoboty() { 
    JFrame ramka = new JFrame(); 
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    MojPanelRysunkowy panel = new MojPanelRysunkowy(); 

    ramka.getContentPane().add(panel); 
    ramka.setSize(300,300); 
    ramka.setVisible(true); 

    for (int i = 0; i < 130; i++) { 
     x++; 
     y++; 

     panel.repaint(); 

     try { 
     Thread.sleep(100); 
     } catch (Exception ex) { } 
    } 
    } // koniec doRoboty() 

    public class MojPanelRysunkowy extends JPanel { 
    public void paintComponent(Graphics g) { 
     g.setColor(Color.green); 
     g.fillOval(x,y,40,40); 
    } 
    } // koniec klasy wewnętrznej 

} // koniec klasy zewnętrznej 
+0

代码中断Swing线程规则。使用摆动计时器。 –

+0

这可能与你的问题没有关系,但'paintComponent'应该总是调用它的'super.paintComponent(g)'来确保打印与面板相关的默认元素,所以你不需要关心它们(如边框,背景) 。 – Pshemo

+0

提示:现在是2017年。简单地扔掉你9岁的书,并购买一本新书,或按照最近的最新教程。 Oracle对swing和javafx都有大量的资料:https://docs.oracle.com/javase/tutorial/ – GhostCat

你已经错过了呼叫super.paintComponent(Graphics g)这就是为什么:)固定实现:

import javax.swing.*; 
import java.awt.*; 

public class ProstaAnimacja { 

    int x = 70; 
    int y = 70; 

    public static void main(String[] args) { 
    ProstaAnimacja gui = new ProstaAnimacja(); 
    gui.doRoboty(); 
    } 

    public void doRoboty() { 
    JFrame ramka = new JFrame(); 
    ramka.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

    MojPanelRysunkowy panel = new MojPanelRysunkowy(); 

    ramka.getContentPane().add(panel); 
    ramka.setSize(300,300); 
    ramka.setVisible(true); 

    for (int i = 0; i < 130; i++) { 
     x++; 
     y++; 

     panel.repaint(); 

     try { 
     Thread.sleep(100); 
     } catch (Exception ex) { } 
    } 
    } // koniec doRoboty() 

    public class MojPanelRysunkowy extends JPanel { 
    public void paintComponent(Graphics g) { 
     //The fix is in the next line - it clears the background 
     super.paintComponent(g); 
     g.setColor(Color.green); 
     g.fillOval(x,y,40,40); 
    } 
    } // koniec klasy wewnętrznej 

} // koniec klasy zewnętrznej 
+0

谢谢。不能给你+1 –