1

ボタンが押されている間、メソッドを繰り返し呼び出そうとしています。しかし、私は無限ループになります。誰か助けてもらえますか?

private void jButton6MousePressed(java.awt.event.MouseEvent evt) {  
    pressed = true;
    while(pressed) {
        car.accelerator();
    }
}

private void jButton6MouseReleased(java.awt.event.MouseEvent evt) {
   pressed = false;
}

ありがとう。

4

4 に答える 4

1

無限ループを作成したため、無限ループが発生します。

JButton.addActionListener(new ActionListener(){
  public void actionPerformed(ActionEvent e) {
   car.accelerator();
  }
});

自分自身を保持している間にアクションを繰り返したい場合、これはより困難です。これを行う方法の例を次に示します。つまり、スレッドを使用する必要があります。

于 2013-02-17T18:07:12.183 に答える
0

一度押されたものがtrueに設定されると、whileループを終了することは決してないので、ボタンが押されていないという事実は登録されず、プログラムはスタックします。私が考えることができる唯一のことは、タイマーを使用して JButton の状態を定期的にチェックすることです。または、マルチスレッドを使用できます。つまり、スレッド 1 で PRESSED を JButton によって設定されたフィールドにし (実行したように)、スレッド 2 でループを実行して、スレッド 1 で PRESSED のステータスをチェックします。

編集: おっと、bmorris591 が既にマルチスレッドを提案しているようです。

于 2013-02-17T18:07:04.923 に答える
0

何が何をするのかを知らなければcar.accelerator();、正確な提案をすることは不可能です。

何らかの方法で UI と対話する場合car.accelerator()は、注意が必要です。EDT 以外のスレッドから UI を更新しないでください。

代わりに、急速発射を使用できますjavax.swing.Timer

private Timer accelerateTimer;

//** ... **//

accelerateTimer = new Timer(15, new ActionListener() {
    public void actionPerformed() {
        car.accelerator();
    }
});
accelerateTimer.setRepeats(true);

//** ... **//

public void mousePressed(MouseEvent me) {
    accelerateTimer.restart();
}

public void mouseReleased(MouseEvent me) {
    accelerateTimer.stop()
}
于 2013-02-17T19:59:30.930 に答える