繁体   English   中英

Java GUI:作为Bullet的JLabel应该通过Jpanel,只给出“结果”

[英]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路由,你可能想看一下SwingWorkerSwingUtilities.invokeLater并记住要小心你可以在EDT之外调用的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM