我有一个自定义的抽象类“Panel”,它继承了JPanel。在绘画方面两者并没有太多的区别。我有一个Panel,并通过更新图像的x值来模拟动画。目前我有两个动画,一个可以正常重绘,另一个不能。下面是关于那个不能的问题。
A和B都遵循同样的格式。更新Panel上的某些变量,调用update(Panel中的一个方法,该方法调用PaintComponent),然后调用repaint。之所以在更新后调用repaint,是因为这个问题之前也是在A上出现过,并且是通过这种方式解决的。
A:更新一个图像变量。 B:更新图像的x变量。
问题:重绘不清除旧图像位置,导致屏幕上出现了一堆混乱的东西。
我尝试过:
1.我经常看到提到super.PaintComponent(g),但这没有解决问题。
2.我尝试改变调用repaint/update方法的顺序。
3.repaint根本不更新Panel。(可能是因为绘制是在PaintComponent中完成的)
如果能获得任何帮助,将不胜感激。
代码:
A和B都遵循同样的格式。更新Panel上的某些变量,调用update(Panel中的一个方法,该方法调用PaintComponent),然后调用repaint。之所以在更新后调用repaint,是因为这个问题之前也是在A上出现过,并且是通过这种方式解决的。
A:更新一个图像变量。 B:更新图像的x变量。
问题:重绘不清除旧图像位置,导致屏幕上出现了一堆混乱的东西。
我尝试过:
1.我经常看到提到super.PaintComponent(g),但这没有解决问题。
2.我尝试改变调用repaint/update方法的顺序。
3.repaint根本不更新Panel。(可能是因为绘制是在PaintComponent中完成的)
如果能获得任何帮助,将不胜感激。
代码:
public Panel (boolean visible){
super();
this.setLayout(new BorderLayout(640, 416));//sets the Layout type of the panel
this.setOpaque(false);//Makes it so that the panel underneath can be seen where images aren't drawn
this.setVisible(visible);
ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
gs = ge.getDefaultScreenDevice();
gc = gs.getDefaultConfiguration();
}
public void paintComponent (Graphics g){
setUp();
drawOff();
setDown(g);
}
private void setUp(){
off_screen = gc.createCompatibleImage(getSize().width, getSize().height, Transparency.TRANSLUCENT);
buffer = off_screen.createGraphics();
}
protected abstract void drawOff();
private void setDown(Graphics g){
g.drawImage(off_screen,0,0,this);
off_screen.flush();
}
public void update(){
paintComponent(this.getGraphics());
}
动画方法(mg是相关面板):
private void battleStart(User user) {
for (int i = 0; i < user.battle.length; i++) {
mg.battleStart(user.battleStart(i));
mg.update();
try {
Thread.sleep(150);
} catch (Exception e) {
}
mg.repaint();
}
}
private void animateStart(User user){
for (int i = 0; i < 10; i++){
mg.x = mg.x + 10;
mg.update();
try {
Thread.sleep(100);
} catch (Exception e) {
}
mg.repaint();
}
}