【发布时间】:2011-11-15 12:22:48
【问题描述】:
我有一个自定义的抽象类“Panel”,它扩展了 JPanel。两者在绘画时没有太大区别。我有一个面板,我正在通过更新图像的 x 值来模拟动画。我现在有两个动画,一个可以正确重绘,另一个不能。这是给没有的。有效的标记为 A,无效的标记为 B。
A 和 B 遵循相同的格式。更新 Panel 上的某个变量,调用 update(Panel 中调用 PaintComponent 的方法),然后调用 repaint。它会调用 repaint after,因为这个问题之前是 A 的问题,并且已经通过这种方式解决了。
A:更新图像变量。 B:更新图像的 x 变量。
问题:重绘不会清除旧图像位置,因此屏幕上会出现混乱。
我尝试过的:
- 我见过很多提到的 super.PaintComponent(g),但是这个 没有解决问题。
- 我尝试更改重绘/更新方法的顺序 调用。
- 重绘根本不会更新面板。 (可能是因为 绘画在 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();
}
}
【问题讨论】:
-
也许双缓冲会有所帮助 - 查看Painting in AWT and Swing
-
为什么要直接调用paintComponent()?我从未在 Swing 图形程序中看到过这种情况。你的整个设计似乎……不寻常。你在学习某种教程吗?
-
你为什么要从paintComponent中创建你的off_screen图像?这违背了离开屏幕的目的,因为它不必要地减慢了你的绘画速度?
-
另外,您是否注意在 EDT 的后台线程中制作动画?