[英]Java GUI : JLabel as Bullet should fly through Jpanel, gives only “result”
首先:我对这些东西很新,但非常感兴趣。 我很确定我的问题的答案已经出现在某处,但由于缺乏知识,我无法理解它。
直接问题:
JLabel玩家:你控制JLabel子弹的标签:你拍摄的标签,当被触发时(alerady在主类中解决)
public class Shoot extends Thread {
public Shoot(JLabel bullet, JLabel player) {
bullet.setLocation(player.getX(),player.getY());
int bulletX = player.getX();
int bulletY = player.getY();
for (int i = 0; i <= 20; i++) {
bullet.setText("o");
bullet.setLocation(bulletX,bulletY - 20);
try {
sleep(200);
}catch (InterruptedException ie){}
bullet.setText("");
}
}
}
这里的问题是,子弹的“进展”是不可见的。 我希望当它仍在飞行时看到子弹,并在达到范围时消失。 (当i = 20时)
请帮我
丹尼斯
是的,解决方案在那里:不要在Swing事件线程上调用Thread.sleep(...),因为这会使整个GUI进入休眠状态。 相反,使用Swing Timer 。
你是Thread
子类,所以我假设你希望在线程中运行你的循环。 要做到这一点,你应该覆盖run
(让你的代码在Shoot
构造函数中只是一个方法调用):
public class Shoot extends Thread {
JLabel bullet;
JLabel player;
public Shoot(JLabel bullet, JLabel player) {
this.bullet = bullet;
this.player = player;
}
public void run() {
// Your code from here on...
bullet.setLocation(player.getX(),player.getY());
int bulletX = player.getX();
int bulletY = player.getY();
for (int i = 0; i <= 20; i++) {
bullet.setText("o");
bullet.setLocation(bulletX,bulletY - 20);
try {
sleep(200);
}catch (InterruptedException ie){}
bullet.setText("");
}
}
}
在某个地方你可能会这样做:
Shoot shoot = new Shoot(bullet, player);
要实际让线程运行,请添加以下行:
shoot.start();
现在出现了不好的部分:你不应该在Event Dispatch Thread(EDT)之外调用大多数Swing方法。 EDT很可能就是你创建Shoot
实例的那个。 Shoot类中的线程与EDT不同。 要从那里调用Swing方法,您需要使用SwingUtilities.invokeLater
:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
bullet.setText("o");
bullet.setLocation(bulletX,bulletY - 20);
}
});
您可以使用基于线程的方法来了解这一点。 如果您的代码不仅仅是一个练习,那么您不应该在Swing上修复。 (正如在其他评论和答案中已经提到的那样)
如果你想要进行多线程Swing路由,你可能想看一下SwingWorker
和SwingUtilities.invokeLater
并记住要小心你可以在EDT
之外调用的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.