2013-05-30 2 views
0

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

private JButton playButton = new JButton("Play!"); 
playButton.addActionListener(new ActionListener(){ 
public void actionPerformed(ActionEvent e) 
{ 
    ????? 
} 

Я знаю, что ответ на мою проблему идет, но мои попытки только что закончились в небьющемся цикле.

Я спросил кого-то еще, и мне сказали, что мне придется запускать что-то в отдельной теме. Проблема в том, что я ничего не знаю о потоках. Есть ли другой способ сделать это без потоков?

+0

Если это долго работающая задача, вам придется использовать поток, и в этом случае это так. –

+2

Используйте [SwingWorker] (http://docs.oracle.com/javase/7/docs/api/javax/swing/SwingWorker.html) и быстро просмотрите соответствующий [учебник] (http: // docs. oracle.com/javase/tutorial/uiswing/concurrency/worker.html) – Xeon

ответ

0

Реализация функции/метода, которая работает непрерывно, пока не будет передана внешним сигналом для остановки ... трудно обойтись без потоков. Обработчики событий элементов GUI, по своей природе, работают на отдельных потоках с логикой приложения, потому что если они выполняются синхронно (т.е. кнопка управления ожидает, что некоторая обработка будет выполнена, прежде чем сможет принять событие click еще раз) ... такой приложение будет сосать. Реальная история, братан.

0
boolean running = false; 
private JButton playButton = new JButton("Play!"); 
Thread stuff = new Thread(new RunningThread()); 
playButton.addActionListener(new ActionListener(){ 
public void actionPerformed(ActionEvent e) 
{ 
    if (!running) { 
     stuff.start(); 
     running = true; 
    } 
    else { 
     if (stuff.isAlive()) { 
      stuff.stop(); 
     } 
     running = false; 
    } 

} 

public class RunningThread implements Runnable { 

    public RunningThread() { 
    } 

    @Override 
    public void run() { 
     //DO STUFF: You also want a way to tell that you are finished and that the next button press should start it up again, so at the end make a function like imDone() that sends a message to your page that changes running = false; 
    } 

} 

Нечто подобное должно работать. Единственная проблема заключается в том, что это остановка, а не пауза. Пауза будет немного сложнее и зависит от того, что именно происходит внутри функции.

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