2015-02-01 3 views
0

Итак, я просматривал Интернет для ответов, но чувствую себя перегруженным и не могу найти объяснения этого. Для одного из моих классов нам был приведен пример с кодом, очень похожим на то, что я использую, и я его скопировал (опасно, что знаю, но не уверен, как это сделать.)Вызов метода startTimer Multiple Times (Java)

Я пытаюсь сделать это так что при нажатии кнопки JLabel считывает определенный текст и через 5 секунд этот текст исчезает. Я смог сделать это успешно, но есть уловка. У меня есть 6 JButtons, которые используют один и тот же ActionListener, который при правильных условиях может вызвать метод startStatusTimer.

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

Я продолжаю получать значения count> 5, распечатывая после нескольких нажатий несколько раз в течение нескольких секунд, но я не вижу, как это может быть из-за инструкции if.

Это не похоже на хорошую практику кодирования, чтобы оставить кучу таймеров, работающих в фоновом режиме, и как их остановить?

private void startStatusTimer() 
{ 
    ActionListener taskPerformer = new ActionListener() 
    { 
     int count=0; 
     public void actionPerformed(ActionEvent event) 
     { 
      count++; 
      System.out.println(count); 
      if(count>=5) 
      { 
       statusLabel.setText(""); 
       statusTimer.stop(); 
      } 
     } 
    }; 
    statusTimer = new Timer(second, taskPerformer); 
    statusTimer.start(); 
} 

System.out.println предназначен для отладки. Любая помощь приветствуется.

+0

Создать 'statusTimer' только если это' null "и очистите его до" null "после завершения вашей логики. Вероятно, стоит также сделать этот код потокобезопасным, добавив 'synchronized (someFinalObject)' к слушателю и 'startStatusTimer' последние два оператора. –

+0

Спасибо Виктору Сорокину, я добавил нулевые утверждения, и он остановил несколько таймеров от выхода ... единственное, что я хочу, чтобы последний таймер был попыткой начать начало 5-секундного таймера. Если кнопка нажата и 2 секунды пройдет, и кнопка снова нажата, я хочу, чтобы она оставалась на 5 секунд до тех пор, пока JLabel не очистится, а не 3 секунды. – Khaines0625

ответ

0

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

Как правило, нет, вы не хотите, чтобы иметь несколько свинг Timer s работает, если вы можете помочь Это. Они не будут хорошо масштабироваться (чем больше вы добавляете, тем хуже становится). Если вы пытаетесь сделать то же или подобное, попробуйте использовать как можно меньше Timer s.

Вместо этого попробуйте создать один экземпляр Timer ...

public class ... { 
    private Timer wipeOutTimer; 

    public ...() { 
      wipeOutTimer = new Timer(5000, new ActionListener() { 
       public void actionPerformed(ActionEvent event) 
       { 
        statusLabel.setText(""); 
       } 
      }); 
      wipeOutTimer.setRepeats(false); 
    } 

Тогда в вашем startStatusTimer вы можете проверить состояние Timer ...

private void startStatusTimer() { 
    if (!wipeOutTimer.isRunning()) { 
     wipeOutTimer.start(); 
    } 

Это обеспечит независимо от того, сколько раз вы нажимаете кнопки, пока будет только один Timer, и он будет запущен только один раз в течение 5 секунд.

так как я могу их остановить?

Это зависит от того, что вы пытаетесь сделать. Вы можете использовать setRepeats(false), поэтому таймер будет работать только один раз. Вы можете также использовать isRunning, чтобы проверить, если Timer уже запущен, и даже использовать restart вызвать таймер для сброса, если вы хотите, чтобы ...

Каким образом можно сделать перезапуск таймера 5 секунд каждый раз нажата кнопка?

Просто позвоните restart

private void startStatusTimer() { 
    if (!wipeOutTimer.isRunning()) { 
     wipeOutTimer.start(); 
    } else { 
     wipeOutTimer.restart(); 
    } 

Вы действительно можете просто позвонить restart каждый раз, но это показывает некоторые дополнительные функциональные возможности вы, возможно, не знают о ...

+0

Благодарим за отзыв. Я вижу, как вы это делали, он более чистый и лаконичный, и он не запускает таймеры. Одна вещь, хотя ... как я вижу, таймер не перезапускается до 5 секунд каждый раз, когда нажимается кнопка, но продолжает отсчет первых 5 секунд от первого нажатия. Как я могу перезапустить таймер до 5 секунд при каждом нажатии кнопки? Я мог бы попробовать, может быть: личного недействительного startStatusTimer() { если (wipeOutTimer.isRunning()) { wipeOutTimer.stop(); wipeOutTimer.start(); } Я дам этот снимок ... – Khaines0625

+0

«Таймер» настроен не на повторение, поэтому, как только он достигнет первых 5 секунд, он остановится. Если вы хотите «перезагрузить» таймер каждый раз, когда вызывается 'startStatusTimer', тогда, когда' isRunning' истинно, просто вызовите 'restart', который сбросит таймер ... – MadProgrammer

+0

Извините, я решил это сейчас , Спасибо вам за помощь. – Khaines0625

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