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();

次に悪い点があります。ほとんどの Swing メソッドは、イベント ディスパッチ スレッド (EDT) の外で呼び出すべきではありません。のインスタンスを作成するのはおそらく 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.invokeLaterEDT

于 2012-07-04T20:10:19.390 に答える