我从2008 Java Book(Java Heads First)中提取了这段代码。并在同一时间提取其他代码。一个是工作,另一个不是。两者都在动画中使用repaint()方法。我非常仔细地比较了两个代码,它们是一样的!我无法解释为什么这段代码不会重新绘制自己......只有在我最小化和最大化时才会重新绘制,但在for循环期间不会重新绘制。我将向您展示不起作用的代码。感谢您的任何意见。
代码:
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 :(得分:1)
您错过了对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