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

Swing 线程进入无限循环。您应该在另一个线程中运行循环:

private class BooleanHolder{
   bool pressed;
};
final BooleanHolder pressed = new BooleanHolder();


private void jButton6MousePressed(java.awt.event.MouseEvent evt) {  
   presed.pressed=true;
   Thread t = new Thread( new Runnable(){
      public void run(){
         while(pressed.pressed)
         {
           car.accelerator();
         }
      }
   }
   t.start();
}
private void jButton6MouseReleased(java.awt.event.MouseEvent evt) {
   pressed.pressed=false;
}
于 2013-02-17T18:20:16.373 回答
0

如果不知道做什么car.accelerator();,就不可能做出准确的建议。

如果car.accelerator()以任何方式与 UI 交互,您需要小心,您不应该从除 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 回答
0

我很确定一旦按下设置为true,你就永远不会退出while循环,所以按钮没有被按下的事实永远不会注册,程序被卡住了。我唯一能想到的就是使用计时器定期检查 JButton 的状态。或者,您可以使用多线程。也就是说,将 PRESSED 设置为线程 1 中由 JButton 设置的字段(正如您所做的那样),并在线程 2 中设置循环,检查线程 1 中 PRESSED 的状态。

编辑:哎呀,我看到 bmorris591 已经建议使用多线程。

于 2013-02-17T18:07:04.923 回答