Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JButtons启动和暂停SwingWorker线程_Java_Multithreading_Swing - Fatal编程技术网

Java 如何使用JButtons启动和暂停SwingWorker线程

Java 如何使用JButtons启动和暂停SwingWorker线程,java,multithreading,swing,Java,Multithreading,Swing,我正在努力学习Swing中的线程 我有一个带有JProgressBar(进度)的框架,五个JButton(开始、暂停、恢复、取消、关闭)和一个JLabel(label1) 框架打开。仅启用“启动”。Start呼叫我的班级进步者: 再次彻底更新 前进者前进者//声明为类变量,在构造函数中初始化new,然后在重写的done方法中再次初始化 下面是ButtonListener类: public class ButtonListener implements ActionListener{ pu

我正在努力学习Swing中的线程

我有一个带有JProgressBar(进度)的框架,五个JButton(开始、暂停、恢复、取消、关闭)和一个JLabel(label1)

框架打开。仅启用“启动”。Start呼叫我的班级进步者:

再次彻底更新

前进者前进者//声明为类变量,在构造函数中初始化
new
,然后在重写的
done
方法中再次初始化

下面是ButtonListener类:

public class ButtonListener implements ActionListener{
    public void actionPerformed(ActionEvent e)
    {

        if (e.getSource() == jbStart) {
            progressor.execute();
            label1.setText("Progressing ...");
            jbCancel.setEnabled(true);
            jbResume.setEnabled(true);
            jbSuspend.setEnabled(true);
            jbClose.setEnabled(true);
        }
        if(e.getSource() == jbCancel) {
            progressor.cancel(true);
            label1.setText("Progress Canceled");
        }
        if (e.getSource() == jbSuspend) {
            label1.setText(progressor.suspendProgress());
        }
        if (e.getSource() == jbResume) {
            label1.setText(progressor.resumeProgress());
        }
        if (e.getSource() == jbClose) {
            dispose();
        }

    }
}//按钮列表器

下面是SwingWorker类:

public class Progressor extends SwingWorker<Void, Integer> {

    private volatile boolean suspend = false;
    private Object lock = new Object();

    @Override
    protected Void doInBackground() {

        for (int i = 0; i <= 10; i++) {
            checkForSuspend();
            try {
                Thread.sleep(1000);
            }
            catch (InterruptedException e) {
            }
            publish(i);
        }   
        return null;
    }

    @Override
    protected void process(List<Integer> list) {
        int value = list.get(list.size() - 1);
        progress.setValue(value);

    }

    public void checkForSuspend() {
        synchronized (lock) {
            while (suspend) {
                try {
                    lock.wait();
                } catch (InterruptedException ie){
                }
            }
        }
    }//checkForSuspend

    @Override
    protected void done() {
        label1.setText("All Done.  Press close to exit");
        progressor = new Progressor();
    }

    public synchronized String suspendProgress() {
        suspend = true;
        return "Progress suspended ...";
    }

    public synchronized String resumeProgress() {
        synchronized (lock) {
            suspend = false;
            lock.notify();
            return "Progress resumed ...";
        }
    }


}//Progressor class
公共类Progressor扩展SwingWorker{
private-volatile boolean-suspend=false;
私有对象锁=新对象();
@凌驾
受保护的Void doInBackground(){
对于(inti=0;i这个问题看起来与你的问题非常相似,答案中有一些很好的例子

至于您自己的代码以及它不起作用的原因:

  • 每次单击都会创建一个新的progressor。您应该使用并控制它,而不是每次都创建新的progressor
  • 暂停时,progressor将完成工作,而不是暂停。正如上面的问题所述,您应该在计算的某些点上查看标志并对其执行操作。示例:

    while (!cancel) {
        if (!suspended) {
            for (int i = 1; i <= 10; i++) {
                    Thread.sleep(1000);
                    publish(i);
            }
        }
    }
    
    while(!cancel){
    如果(!暂停){
    
    对于(int i=1;i您的线程应该在while循环中运行,该循环寻找一个布尔值来更改另一个对象的值,然后在单击按钮时使用setPause(true/false)更改状态:

    while(true){
        if(object_everyone_can_reference.getPause()){
        Thread.sleep(1000);
         }
    
     }
    

    谢谢你的链接,但我认为SwingWorker只能使用一次。我应该在何处以及如何创建一个按钮来控制?@也许不是,SwingWorker和任何线程一样,不能多次调用
    execute()(可能是在表单初始化过程中,或者第一次按start时),然后在执行过程中查看控制标记我不知道。我这样做了-在buttonlistener之外创建了progressor,并使用了您建议的代码,但它仍然不起作用。Cancel与p.Cancel一起工作(true);但这就像线程在进行过程中没有检查标志。@可能不是。你能发布更新的代码吗?只是提醒一下,线程只会在计数10时挂起,即如果在3时挂起,在挂起之前它仍会计数到10。我只是在原始问题中发布了更新的代码。你是对的,当然它不会被打断g
    。但是我如何中断
    for
    循环以检查
    挂起
    ?当然,为什么我需要
    for
    ?我可以在
    循环时增加
    ,它每次都会检查!