当前位置: 首页 > 知识库问答 >
问题:

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

文华美
2023-03-14

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

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

我用开始按钮开始一个无限循环。我想用“停止”按钮关闭那个回路。

>

  • if(stop.getModel(). isP的()){中断;}不工作

    actionListener用于识别按钮单击并在循环也不起作用时使用中断语句终止

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

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

  • 共有1个答案

    屠嘉
    2023-03-14

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

    为了避免这种情况,并使其发挥作用,你将不得不使用SwingWorker。一个类,允许您在后台运行长时间/繁重的任务,并(可选)在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());
        }
    
    }
    
     类似资料:
    • 我有一个程序,它每秒钟响一次,直到停止。问题是,在我按下“开始”并发出嘟嘟声后,我无法单击“停止”按钮,因为窗口冻结。欢迎任何帮助。

    • 问题内容: 因此,我有一个Tkinter GUI,其中有两个简单的选项,即开始和停止按钮。我已经定义了GUI布局: 此处的“开始”按钮运行无限循环扫描,而“停止”按钮在按下时应会中断: 但是,当我按下“开始”按钮时,它总是被按下(假定由于无限循环)。但是,我 无法单击“停止”按钮 来打破while循环。 问题答案: 您不能在Tkinter事件循环所处的同一线程中启动循环。这样做将阻塞Tkinter

    • 我正在尝试做一个数字猜测游戏,如果用户匹配他们赢得现金的幸运数字,游戏将继续进行,直到他们用完现金。他们每打一轮都要付赌注。每一轮都会产生一个新的随机数。 我只想使用一个输入。当我把输入放在循环中,循环无限停止循环,当我把它放在循环外,它无限开始循环。我该怎么阻止这一切?我需要向while循环添加什么?我尝试突破,但我想继续比赛,直到钱用完。 我只想使用一个输入,但是当我把输入带出循环(lucky

    • 问题内容: 有没有一种方法可以停止执行无限循环的线程? 问题答案: 是的,您可以将替换(或在逻辑上)。 这样,当任务取消时,循环将终止。 循环看起来像这样: 使用应该是这样的:

    • 不知道如何阻止这个while循环无限重复。我使用检查用户输入是否为int。如果没有输入int值,则循环将无限重复。

    • 问题内容: 我想如果用户按下主页按钮,我的服务将停止,这是我的代码,但对我不起作用,请帮助我: 谢谢 问题答案: 如果您试图确保该服务仅在相关活动可见时运行,则更好的解决方案是在用户正在运行的任何活动的onPause()方法中停止该服务。这样,当用户按下“返回”时和当用户按下“主页”时,将处理事件。 同样,您可以将服务绑定到一个或多个活动。当绑定到绑定服务的所有活动停止时,绑定服务将被销毁。