2015-05-06 6 views
1

У меня есть функция, которая мигает границей JButton, которая вызывается несколько раз подряд. Я хочу, чтобы процессы продолжались только после завершения всей функции. Прямо сейчас, мигание начинается для одной кнопки, после чего начинается другая, прежде чем мигание остановится для первой кнопки. Функция выглядит следующим образом, который в классе, который простирается JButton:Подождите, пока таймер/процесс завершится до продолжения

public void flash() { 
    final Timer timer = new Timer(7, new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      alpha += increment; 
      if (alpha >= 255) { 
       alpha = 255; 
       increment = -increment; 
      } 
      if (alpha <= 0) { 
       alpha = 0; 
       increment = -increment; 
      } 
      setBorder(BorderFactory.createLineBorder(new Color(81, 171, 112, alpha), 4)); 
     } 
    }); 

    timer.start(); 

    final Timer delay = new Timer(
      2000, 
      new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0, 0), 0)); 
      timer.stop(); 
     } 
    }); 
    delay.setRepeats(false); 
    delay.setCoalesce(true); 
    delay.start(); 
} 
+0

Измените свой вопрос, чтобы сделать ваше поведение более ясным. Если под «процессами» вы подразумеваете любой код в текущем потоке, кроме кода 'flash(), вы можете просто сделать' flash() 'блокирующим вызовом. Тем не менее, я подозреваю, что вы действительно хотите для каждого вызова 'flash()' для очереди события, которое должно дождаться завершения всех предыдущих вызовов 'flash()'. Таким образом, позволяя другому коду продолжать и только задерживая код 'flash()'. – CandiedOrange

+0

BTW, 'delay.setCoalesce (true);' ничего не делает для вас, так как значение true является значением по умолчанию. http://docs.oracle.com/javase/7/docs/api/javax/swing/Timer.html#setCoalesce(boolean) – CandiedOrange

+0

Спасибо за помощь, но вы правы. Я хочу, чтобы все вызовы flash() завершились до вызова следующего. – tbcrawford

ответ

0

Основная проблема у вас здесь является то, что существует множество объектов кнопок. Это означает, что каждый flash() живет в независимом объекте (поскольку он не является статическим). Это означает, что каждая кнопка не знает, мигают ли другие или нет.

Что вам нужно, это одно место, которое выполняет мигание. Место, где все, что нужно, может произойти, может свалить работу. Место, которое знает о кнопках, чтобы они могли манипулировать своими границами. Позволяет называть его flasherQueue.

Для этого может быть использован статический член, но более гибкая конструкция вводит один объект flasherQueue в каждый из объектов кнопки, поскольку они построены. Каждая кнопка, знающая о flasherQueue, требуется только в том случае, если это кнопки, которые определяют, когда нужно мигать.

На этом этапе вы можете сделать свои кнопки flash() в блокирующий вызов. Независимо от того, что вы решили выпустить, кнопка просто передает ссылку на кнопку flasherQueue. flasherQueue, зацикливаясь в собственном потоке, перемалывается через любые кнопки, которые были приведены по порядку, ожидая, что каждый закончит мигать.

Выполнено так, что вы должны иметь хотя бы одну мигающую кнопку одновременно и должны иметь возможность обрабатывать другие события, чтобы ваш графический интерфейс должен был перерисовываться.

Это действительно дегенеративная форма producer/consumer. Пока у вас есть только один потребитель, вызывающий кнопки flash(), только одна кнопка будет мигать одновременно. Вероятно, вы сможете использовать java's BlockingQueue для вашей структуры данных за flasherQueue.

+0

Звучит здорово! Некоторые из них, безусловно, над моей головой, но я думаю, что я получил суть того, что вы говорите. Мне нужно кое-что изучить. Я делал игру Java Applet для класса, который я принимаю в колледже. Я включил проект и в итоге нашел что-то, что «сработало». Это было не идеально, хотя я определенно думаю о том, чтобы переписать большую часть программы заново, потому что есть слишком много классов, которые перекрывают друг друга. Еще раз спасибо! Я буду помнить об этом летом, когда переписываю игру! – tbcrawford