2011-04-30 7 views
2

Я в настоящее время программирую на Java. Когда пользователь нажимает кнопку запуска программы, я хотел бы запустить цикл. Но тогда я хотел бы пользователь, чтобы иметь возможность остановить цикл с кнопкой остановки:Java - Запустите цикл, а затем продолжайте?

public class Program { 
    private boolean active; 

    // MVC stuff... 

    private class StartListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      // Do stuff... 

      active = true; 
      hotelCalifornia(); 
     } 
    } 

    private class StopListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      // Do stuff... 

      active = false; 
     } 
    } 

    public void hotelCalifornia() { 
     while (this.active) { 
      // The program never leaves! 
     } 
    } 
} 

Но после запуска цикла, программа выполняет только действия цикла. Есть ли способ обойти это? Есть ли лучший способ достичь моей цели?

Спасибо!

ответ

4

Все события в приложении приложений Java Swing вызывается в одном потоке событий.

Вы должны создать Swing Timer для вызова любого метода, который вы хотите, когда бы он ни был.

4

Во-первых, вам нужно будет начать цикл в новом Thread.

И тогда, когда пользователь нажимает stop(), вызовите thread.interrupt()

Внутри оных петли:

if (Thread.currentThread().isInterrupted()) { 
    break; 
} 
1

Я предлагаю положить логику в то время цикла в работоспособном

class basicThread implements Runnable { 
    public void run() { 
     while (true) { 
      // Put the stuff in your while loop here 
     } 
    } 
} 

Установите нитку, чтобы выполнить ваши работоспособную

// Create a thread to execute your runnable 
Thread thread = new Thread(new basicThread()); 

Тогда звони ниже StartListener

thread.start(); 

И ниже в StopListener

thread.interrupt() 
1

Есть две вещи, которые следует учитывать.

Во-первых, вы создаете долговременный процесс в потоке отправки событий. Это то, чего вы никогда не должны делать. Как отмечает Никан, в этом потоке будут вызываться все графические события в вашем приложении Swing. Когда пользователь нажимает кнопку «Пуск», ваш actionPerformed в вашем StartListener будет вызван в EDT. Прочтите here для получения дополнительной информации о Swing Threading.

Это приводит ко второму пункту: вы захотите запустить свой hotelCalifornia в другой теме. Вы можете оставить ссылку на эту тему вокруг, чтобы вы могли позвонить thread.interrupt(), как указывает Божо. У вас также есть возможность работать со своей собственной реализацией, но вы должны убедиться, что ваш active var объявлен как volatile, так что состояние логического уровня сразу доступно для вашего нового потока после его обновления.

+0

Очень информационный. Спасибо тебе за это. – Peter

1

Опцией было бы использовать SwingWorker. Когда вы больше не хотите его запускать, вызовите метод cancel() на нем и проверьте, есть isCancelled() в вашем цикле.

Смежные вопросы