【发布时间】:2018-02-27 03:10:34
【问题描述】:
我正在尝试让我的游戏中的一个桶自己向下浮动到屏幕上,我尝试了一些东西并查看了一些教程,但我似乎无法让它工作。也许我通过尝试在paintcomponent()中执行此操作以错误的方式处理此问题?在我的 JPanel 中,我还有一个汽车对象,它是由 KeyListeners 控制的 JPanel 的扩展。
// this is inside a JPanel class that I made that's painting out the game
OilBarrel barrel = new OilBarrel();
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
road.paintComponent(g);
this.add(car);
this.add(barrel);
barrel.setBounds(barrelX, barrel.getBarrelY(), 150, 180);
int carX = car.getCarX();
car.setBounds(carX, carY, 800, 400);
barrel.setBounds(550, barrel.getBarrelY(), 800, 400);
while (true) {
barrel.move();
repaint();
try {
Thread.sleep(1);
} catch (Exception e) {
}
}
}
// this is the oilbarrel class
import java.awt.Dimension;
import java.awt.Image;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
public class OilBarrel extends JLabel{
int barrelX;
int barrelY = 0;
public OilBarrel() {
setVisible(true);
this.setFocusable(true);
Image img = new ImageIcon(this.getClass().getResource("/oil.png")).getImage();
this.setIcon(new ImageIcon(img));
}
public void move(){
if(barrelY<1000)
barrelY +=1;
}
public int getBarrelY() {
return barrelY;
}
}
【问题讨论】:
-
在
paintComponent()中有一个while(true)不是办法。您应该运行一个单独的线程来调用 move() 然后每隔一段时间重新绘制。 -
嗯.. 总的来说,我对摇摆和线程真的很陌生。我可以为 while 条件设置一个计数器。您能否更具体一点,或者就您的线程想法举个例子?
-
不要调用
road.paintComponent(g);- 永远不需要在组件上手动调用paint或paintComponent,如果你发现自己这样做了,那么你做错了什么.另外,不要在paintComponent方法中修改其他组件的状态。其实这种工作不要这样用组件 -
@MadProgrammer 你是什么意思我不应该“以这种方式”使用组件?你能澄清一下吗?我想我可以只添加一条道路而不是把它画出来。您还说我不应该修改其他组件的状态,但是例如可以调用paintyourself 中的方法来执行此操作吗?谢谢
-
@MarkoMarinkovic 组件需要对它们的大小和位置(特别是)进行大量的微观管理,如果处理得当,它们也是自绘的。与纯定制的绘画路线相比,他们需要更多的工作来管理