1

我正在编写一个程序,它在单击开始按钮时启动一个循环,我想用一个停止按钮停止它。问题是循环开始按钮在循环完成之前不起作用。我搜索了类似的问题并了解问题是循环在 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;
            }
        }
    }
4

3 回答 3

5

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

由于这是一个非常笼统的问题(我的回答也非常笼统),我建议在 Google 上寻找“AWT ui thread”、“Worker thread”和“Java threading”。

一个好的起点可能是课程:Swing 中的并发性

于 2012-10-10T14:04:44.030 回答
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!

于 2012-10-10T14:06:01.427 回答
0

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

于 2012-10-10T14:49:34.397 回答