0

首先:我对这个东西很陌生,但非常感兴趣。我很确定我的问题的答案已经在某个地方,但由于缺乏知识,我无法真正理解它。

直奔问题:

JLabel player : 你控制的标签 JLabel bullet : 你射击的标签,当触发时(已经在主类中解决了)

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 时)

请帮我

丹尼斯

4

2 回答 2

1

是的,解决方案就在那里:不要在 Swing 事件线程上调用 Thread.sleep(...) ,因为这会使你的整个 GUI 进入睡眠状态。相反,请使用Swing Timer

于 2012-07-04T16:53:30.943 回答
1

你是子类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();

现在出现了不好的部分:您不应该在事件调度线程 (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 路线,你可能想看看SwingWorkerSwingUtilities.invokeLater记住要小心你可以在EDT.

于 2012-07-04T20:10:19.390 回答