остановить бесконечный цикл с помощью кнопки остановки - PullRequest
0 голосов
/ 19 февраля 2019

После запуска бесконечного цикла я не могу закрыть 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 после запуска бесконечного цикла с помощью кнопки запуска.

1 Ответ

0 голосов
/ 19 февраля 2019

Во-первых, вы не можете нажать кнопку «Стоп», потому что вы запускаете большую задачу (часть кода while(true)) в потоке Event Dispatch , которая приведет кGUI для замораживания.

Чтобы избежать этого и заставить его работать, вам придется использовать SwingWorker. Класс, который позволяет запускать длинные / тяжелые задачи в фоновом режиме и(необязательно) опубликуйте их в графическом интерфейсе.

Затем, если вы хотите отменить этот 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());
    }

}
...