为什么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
答
你已经错过了呼叫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 –
代码中断Swing线程规则。使用摆动计时器。 –
这可能与你的问题没有关系,但'paintComponent'应该总是调用它的'super.paintComponent(g)'来确保打印与面板相关的默认元素,所以你不需要关心它们(如边框,背景) 。 – Pshemo
提示:现在是2017年。简单地扔掉你9岁的书,并购买一本新书,或按照最近的最新教程。 Oracle对swing和javafx都有大量的资料:https://docs.oracle.com/javase/tutorial/ – GhostCat