如何在按下按钮时重复调用方法(Java with Swing)?

时间:2013-02-17 17:56:50

标签: java swing jbutton mousepress

只要按下按钮,我就会尝试重复调用方法。但是我得到了一个无限循环。有谁可以帮助我?

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 个答案:

答案 0 :(得分:1)

你得到一个无限循环因为你写了一个无限循环,你需要

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

如果你希望它在自己拥有时重复动作,那就更难了,here就是你如何做到这一点的一个例子。简而言之,您需要使用线程。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

摆动线程进入无限循环。 你应该在另一个线程中运行你的循环:

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;
}

答案 3 :(得分: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()
}