сергей кузьмин, я попробовал это
Сначала я сделал без runLater. Нажатие на кнопку вызывает метод action внутри контроллера:
public void action() throws InterruptedException {
MyThread mt = new MyThread();
Thread thread = new Thread(mt);
thread.start();
}
class MyThread implements Runnable {
@Override
public void run() {
buttonClicked();
}
}
И все прекрасно работает. Я добился того, чего нужно. В buttonClicked в начале и конце я меняю button.setDisable на true и false соответственно. И когда я делаю клики, кнопка не реагирует на них, пока buttonClicked() не завершит работу
Но проблема в том, что после первого нажатия у меня только один раз выскакивает Exception in thread "Thread-3" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
Естественно исключение это плохо, от него нужно избавляться, для этого как раз в гугле говорят использовать Platform.runLater(). Таким образом, я переделал метод run()
После него исключения не возникает, но код не работает так, как работал без runLater. Я снова могу нажимать на кнопку сколько угодно раз и нажатия будут как бы накапливаться, пока все методы, которые нажатие вызвало, не выполнятся
Орхан Гасанлы, мне предлагали это решение в ответах, я попробовал и в комментах написал что это не сработало, в итоге ответ удалили. Ни флаг ни setDisable у меня не работают.
После button.setDisable(true) я вывожу в консоль button.isDisable и выводится true. Затем тред засыпает, я в это время спамлю кнопку и она все равно нажимается, после того как тред просыпается все эти true выводятся
Nurik,
Допустим, при нажатии на кнопку вызывается метод:
public void action() throws InterruptedException {
System.out.println("action");
Thread.sleep(5000);
}
После вывода текста в консоль, я жму на кнопку 5 раз, до того как тред засыпает на 5 секунд (имитация длительного выполнения кода). После того, как он просыпается, все мои 5 нажатий все равно обрабатываются. Я накликал по кнопке в тот момент, когда выполнялся метод, и после него будут выполняться остальные методы, то есть еще 5 раз выведется слово action в консоль, хотя тред в момент кликов, казалось бы, ничего не обрабатывал
Как сделать так, чтобы пока выполняется код (в данном случае, пока выполняется Thread.sleep), я нажимал на кнопку сколько угодно раз, и после того, как код первого нажатия, первого метода закончил выполняться (тред проснулся), у меня не выполнялись новые методы action() и не выводился текст?
Написано
Войдите на сайт
Чтобы задать вопрос и получить на него квалифицированный ответ.
Сначала я сделал без runLater. Нажатие на кнопку вызывает метод action внутри контроллера:
И все прекрасно работает. Я добился того, чего нужно. В buttonClicked в начале и конце я меняю button.setDisable на true и false соответственно. И когда я делаю клики, кнопка не реагирует на них, пока buttonClicked() не завершит работу
Но проблема в том, что после первого нажатия у меня только один раз выскакивает
Exception in thread "Thread-3" java.lang.IllegalStateException: Not on FX application thread; currentThread = Thread-3
Естественно исключение это плохо, от него нужно избавляться, для этого как раз в гугле говорят использовать Platform.runLater(). Таким образом, я переделал метод run()
После него исключения не возникает, но код не работает так, как работал без runLater. Я снова могу нажимать на кнопку сколько угодно раз и нажатия будут как бы накапливаться, пока все методы, которые нажатие вызвало, не выполнятся