当前位置: 代码迷 >> java >> 使用停止按钮停止无限循环
  详细解决方案

使用停止按钮停止无限循环

热度:31   发布时间:2023-08-02 11:02:08.0

启动无限循环后,我无法关闭JFrame。

我想使用停止按钮停止无限循环。

我正在使用“开始”按钮开始无限循环。 我想使用停止按钮关闭该循环。

  1. if(stop.getModel()。isPressed()){break;}无法正常工作

  2. actionListener用于识别按钮单击并使用break语句终止,同时循环也不起作用

     import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.*; public class NewClass1 { private String arg = ""; public NewClass1() { JFrame frame = new JFrame("Datacolor software automate"); JButton stop = new JButton("STOP"); stop.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { arg = (String)ae.getActionCommand(); System.out.println(arg); } }); JButton button = new JButton("Start"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent ae) { int i = 0; while (true) { try { System.out.println(i); i++; if(arg.equals("STOP")) { break; } } catch (Exception e) { System.out.println(e.toString()); } } } }); frame.add(button); frame.add(stop); frame.setLayout(new FlowLayout()); frame.setSize(300,300); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new NewClass1(); } }); } } 

单击停止按钮时,无限循环必须终止。 使用启动按钮启动无限循环后,我无法使用JFrame中的任何按钮。

您不能首先单击“停止”按钮,这是因为在中运行了一个大任务(代码的while(true)部分),这将导致整个GUI冻结。

为了避免这种情况并使之起作用,您将必须使用 该类使您可以在后台运行长时间/繁重的任务,并(可选)将其发布在GUI中。

然后,如果您想取消此SwingWorker ,则对其的cancel()方法的调用就足够了。

看下面的例子:

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;

public class NewClass1 {
    private String arg = "";
    private SwingWorker<Void, Integer> worker;

    public NewClass1() {
        JFrame frame = new JFrame("Datacolor software automate");
        JButton stop = new JButton("STOP");
        stop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                worker.cancel(true);
            }
        });

        JButton button = new JButton("Start");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                initializeWorker();
                worker.execute();
            }
        });

        frame.add(button);
        frame.add(stop);
        frame.setLayout(new FlowLayout());
        frame.setSize(300, 300);
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

    private void initializeWorker() {
        worker = new SwingWorker<Void, Integer>() {

            @Override
            protected Void doInBackground() throws Exception {
                int i = 0;
                while (!isCancelled()) {
                    i++;
                    publish(i); // give this i to "process" method
                }
                return null;
            }

            @Override
            protected void process(List<Integer> chunks) {
                int i = chunks.get(0);
                System.out.println(i);
            }
        };
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new NewClass1());
    }

}
  相关解决方案