如何用按钮停止循环?

时间:2012-10-10 14:01:55

标签: java loops button

我正在编写一个程序,当单击开始按钮时会启动循环,我想用停止按钮停止它。问题是循环启动按钮在循环完成之前不起作用。 我已经搜索了类似的问题,并且理解问题是循环是在actionPerformed但我无法设法在actionPerformed之外采取循环。 我已经尝试过创建一个新类并调用它等但完全相同的事情发生了。 顺便说一下,我是Java的初学者,也是stackoverflow,如果我做错了,我很抱歉 只需编码:

OtherClass obj;
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == startButton) {
    while(true) {
        obj = new OtherClass();
        obj.doJob();
    }
    else if(e.getSource() == stopButton) {
    obj.stopLoop();
    }
}

public class OtherClass  {
    private boolean isStopped = false;
    public OtherClass() {
    }
    public void doJob(){
        while(true) {
            //loop...
            if(isStopped) {
                break;
            }
        }
    }

3 个答案:

答案 0 :(得分:5)

您需要在单独的线程(也称为“工作线程”)中运行doJob()。按下按钮时启动线程,再次按下时,将isStopped标志设置为true。注意不要在工作线程中执行UI操作(例如更新进度条) - 需要调用特殊方法来从工作线程更新UI。

由于这是一个非常普遍的问题(我的答案也很普遍),我建议在Google上注意“AWT ui thread”,“Worker thread”和“Java threading”。

一个好的起点可能是Lesson: Concurrency in Swing

答案 1 :(得分:0)

你应该使用一个线程。如果你在主线程中运行一个循环,gui将被冻结,直到循环结束。

我们走了:

class yourClass{
...
private volatile boolean threadRunning = false;

public void startThread(){
  Thread t = new Thread(new Runnable(){
      @Override
      public void run(){
          threadRunning = true;
          while(threadRunning){
              //do some job
          }
      }
  });
  t.start();
}

要停止循环,只需添加一个按钮并将threadRunning设置为false!

答案 2 :(得分:0)

Perroloco解决方案没问题,但如果不使用普通布尔值,则使用AtomicBoolean会更好。 原因是,您将有两个线程修改/读取共享资源(工作线程和UI线程)