Если select_cart
вызван из потока диспетчеризации событий
Затем вам нужно изменить свой подход, так как while-loop
блокирует поток диспетчеризации событий, то есть Timer
's *Метод 1006 * никогда не будет вызван.
В этом случае лучшим подходом будет позволить методу actionPerformed
фактически вызвать результат, но для его создания вам понадобится шаблон наблюдателя. работа
Начните с определения обратного вызова interface
, что-то вроде ...
public interface CartSelection {
public void cartSelection(int value);
}
Затем вам нужно изменить код, чтобы использовать этот обратный вызов и переместить основные функции на actionPerformed
, например ...
Timer waiter = new Timer(5000,this);
CartSelection callback;
public void select_cart(CartSelection callback) {
this.callback = callback;
waiter.start();
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == waiter){
waiter.stop();
Random r = new Random();
int random = r.nextInt(getCartNumber()) + 1;
int selection = random;
callback(selection)
}
}
Тогда вы можете назвать select_cart
что-то вроде ...
select_cart(new CartSelection() {
@Override
public void cartSelection(int value) {
// Carry on...
}
});
в качестве примера.
Есликорзина была заполнена каким-то другим процессом, тогда вы могли бы рассмотреть возможность использования других подходов, таких как Lock
объектов, чтобы «дождаться» завершения процесса заполнения.
Точно так же вы могли быиспользуйте SwingWorker
, чтобы заполнить корзину, и когда она будет завершена, publish
результаты, которые будут использованы с помощью другого механизма.
Если select_cart
вызывается из другого потока
Теперь, если вы вызываете select_cart
из другого потока (другогозатем EDT), тогда вам вообще не нужен Timer
, и вы могли бы просто сделать ...
public int select_cart() {
Random r = new Random();
int random = r.nextInt(getCartNumber()) + 1;
int selection = random;
try {
Thread.sleep(5000);
} catch (InterruptedException ex) {
}
return selection;
}