ОБНОВЛЕНИЕ Этот ответ обновляется, потому что @uckelman указал мне, что при условии run = true
кнопка остановки никогда не прерывает цикл while, потому что его нужно изменить на run = false в пределахпетля.Затем я публикую простое и альтернативное решение этой логической проблемы, чтобы запланировать задачу повторно с помощью таймера.Для получения дополнительной информации, пожалуйста, проверьте этот SO вопрос.
О событиях для кнопок: если у вас есть две кнопки, одна для запуска цикла и одна для завершения цикла, просто попробуйте этот код:
class CalcButtonListener implements ActionListener{
private boolean run = true;
private java.util.Timer timer = new java.util.Timer();
private JButton start_loop, end_loop;
//here the buttons initialization
@Override
public void actionPerformed(ActionEvent ae){
if(ae.getSource()==start_loop){
java.util.TimerTask task = new java.util.TimerTask() {
@Override
public void run() {
doStuff();
}
};
timer.schedule(task, java.util.Calendar.getInstance().getTime(), 500);//here the '500' means the time, 500 ms,
the task is repeatedly executed.
}
if(ae.getSource()==end_loop){
timer.cancel();//cancel the tasks scheduled
System.out.println("Task cancelled!");
}
}
private void doStuff(){
robot.mousePress(InputEvent.BUTTON1_MASK);
robot.mouseRelease(InputEvent.BUTTON1_MASK);
robot.delay(num.nextInt(max-min+1)+min);
}
}
Теперь задача doStuff()
планируется выполнять каждые 500 мс.
Другая информация о java.util.Timer и java.util.TimerTask .
О вашей проблеме:
Проблема в том, что у меня есть другая кнопка, чтобы установить для переменной переменную значение false, но после нажатия первой кнопки,Я не могу нажать вторую кнопку или кнопку выхода вверху по этому вопросу.
Как в предыдущем вопросе , так и на этой страниценаписано так:
Правило однопоточности Swing гласит, что компоненты Swing могут быть доступны только одному потоку.Это правило применяется как к получению, так и к установке, и один поток известен как поток события-диспетчеризации.
Правило однопоточности хорошо подходит для компонентов пользовательского интерфейса, поскольку они, как правило, используются в однозадачном режиме.в любом случае, с большинством действий, инициируемых пользователем.Кроме того, создавать безопасные для нитей компоненты сложно и утомительно: это хорошая вещь, которую нельзя делать, если этого можно избежать.Но при всех своих преимуществах правило однопотоковости имеет далеко идущие последствия.
Компоненты Swing, как правило, не будут соответствовать правилу однопоточности, если все их события не отправляются и не принимаются в потоке диспетчеризации событий.Например, события изменения свойств должны отправляться в потоке отправки событий, а события изменения модели - в потоке отправки событий.
Для основанных на модели компонентов, таких как JTable и JTree,Правило однопоточности подразумевает, что доступ к самой модели возможен только из потока событий.По этой причине методы модели должны выполняться быстро и никогда не должны блокироваться, иначе весь пользовательский интерфейс не будет отвечать на запросы.
Затем, если вы разрабатываете свой графический интерфейс с использованием одного потока, когда событие кнопки являетсяВыполнено, ваш графический интерфейс будет зависать, ожидая полного выполнения соответствующего события кнопки.В вашем случае, в бесконечном цикле, ваш GUI всегда будет зависать.
Я предлагаю использовать для вашего GUI SwingWorker или расширить Thread класс (затем разработка графического интерфейса в отдельном потоке) или реализация интерфейса Runnable .Другой альтернативой является использование Timer из пакета javax.swing.Timer
.
Вы можете прочитать этот старый вопрос SO о SwingWorker: Как использовать SwingWorker в Java?
Учебник для SwingWorker: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html
Учебник по созданию темы: http://docs.oracle.com/javase/tutorial/essential/concurrency/
Вопрос по Timer
: Обновление JPanelи атрибуты в графическом интерфейсе, с указанным пользователем таймером?
Учебное пособие по таймеру: http://docs.oracle.com/javase/tutorial/uiswing/misc/timer.html