2017-01-15 14 views
0

Итак, название действительно говорит все. Мне нужен поток, чтобы дождаться окончания таймера до выполнения следующей команды в методе.java ждет выполнения задачи swing.timer перед выполнением следующей задачи

Код:

import javax.swing.Timer; 

public class doesntMatter 
{ 
    Timer timer; 
    ActionListener timerTask; 

    public doesntMatter 
    { 
     timerTask = new ActionListener() 
     { 
       @Override 
       public void actionPerformed(ActionEvent e) 
       { 
        //taskSomethingIdk 
       } 
     } 
    } 

    private void whatever 
    { 
     timer = new Timer(1000, timerTask); 
     timer.setInitialDelay(0); 
     timer.start(); 

     // here i need to wait for the timer to finish 

     if(timerhasfrigginfinished) 
      continueOrSomethingIdk 
    } 

} 
+0

Поместите его в ActionListener таймера, который нужно выполнить, когда он завершит повторение. –

+0

Определить, «когда таймер сделан»? В большинстве случаев таймеры повторяются, хотя вы их не настраиваете. В любом случае вы можете использовать шаблон наблюдателя или просто вызвать какой-либо другой предопределенный метод, когда вы закончите – MadProgrammer

ответ

1

Предполагая, что ваши повторы таймер, внутри проверки ActionListener таймера, чтобы увидеть, если он работает свой последний повтор, и если да, то там, вызовите метод continueOrSomethingIdk().

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

Например:

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.*; 

@SuppressWarnings("serial") 
public class WhenTimerDone extends JPanel { 
    private static final Color[] COLORS = { 
      Color.RED, Color.ORANGE, 
      Color.YELLOW, Color.GREEN, 
      Color.BLUE, Color.CYAN }; 
    private static final String START = "Start"; 
    private static final String DONE = "Done"; 
    private static final int PREF_W = 400; 
    private static final int PREF_H = PREF_W; 
    public static final int TIMER_DELAY = 1000; 
    private JLabel statusLabel = new JLabel(START); 
    private StartAction startAction = new StartAction("Start!"); 

    public WhenTimerDone() { 
     add(statusLabel); 
     add(new JButton(startAction)); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     if (isPreferredSizeSet()) { 
      return super.getPreferredSize(); 
     } 
     return new Dimension(PREF_W, PREF_H); 
    } 

    // this is the method called by the Timer's ActionListener when it is done 
    public void done() { 
     // reset all to baseline state 
     statusLabel.setText(DONE); 
     startAction.setEnabled(true); 
     setBackground(null); 
    } 

    // ActionListener for the start button 
    private class StartAction extends AbstractAction { 

     public StartAction(String name) { 
      super(name); 
      int mnemonic = (int) name.charAt(0); 
      putValue(MNEMONIC_KEY, mnemonic); 
     } 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // disables itself 
      setEnabled(false); 
      statusLabel.setText(START); // updates the status label 

      // create and start a timer 
      Timer timer = new Timer(TIMER_DELAY, new TimerListener()); 
      timer.setInitialDelay(0); 
      timer.start();  
     } 
    } 

    // action listener for the timer 
    private class TimerListener implements ActionListener { 
     private int colorsIndex = 0; 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // simply loops through a colors array, changing background color 
      if (colorsIndex < COLORS.length) { 
       setBackground(COLORS[colorsIndex]); 
       colorsIndex++; 
      } else { 
       // when all colors shown -- stop the timer 
       ((Timer) e.getSource()).stop(); 

       // and call the done method -- ******* here's the key! 
       done(); // called when Timer is done! 
      } 
     } 
    } 

    private static void createAndShowGui() { 
     WhenTimerDone mainPanel = new WhenTimerDone(); 

     JFrame frame = new JFrame("WhenTimerDone"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(mainPanel); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(() -> createAndShowGui()); 
    } 
} 
+0

Это простой способ ... но я хотел бы как-то узнать, когда таймер сделан ... Я не могу поверить это нелегко – user7419985

+0

@ user7419985: см. комментарии в коде, чтобы объяснить, что происходит. Но да, это то, что вам нужно сделать. –

+0

@ user7419985: таймер Swing не имеет механизма добавления addChangeListener (...) 'или' addPropertyChangeListener (...) '. Это простая конструкция. –

0

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

import javax.swing.Timer; 

public class doesntMatter 
{ 
Timer timer; 
ActionListener timerTask; 

public doesntMatter 
{ 
    timerTask = new ActionListener() 
    { 
      @Override 
      public void actionPerformed(ActionEvent e) 
      { 
       synchronized(timer){ 
        //taskSomethingIdk 
        //you would have to rig something so we can access a common object as the monitor/lock object 
        timer.notify() 
       } 
      } 
    } 
} 

private void whatever 
{ 
    timer = new Timer(1000, timerTask); 
    timer.setInitialDelay(0); 
    timer.start(); 
    //Need to obtain a lock on the "monitor" object 
    //Lock will be released while it is waiting 
    synchronized(timer){ 
     timer.wait() 
     //do whatever 
    } 
} 

}

Это заставит «основной» поток ждать, пока поток таймера не вызовет метод уведомления, который затем просыпает одно из ожидающих потоки.

Также я не думаю, что «ActionListener» расширяет «TimerTask». Таким образом, пример кода, вероятно, не компилируется из-за того, что вы предоставляете ActionListener Timer, который ожидает TimerTask в качестве входа. Или, может быть, я почему-то не понимаю, что ваш код должен делать в любом случае.

Для получения дополнительной информации см. How to use wait and notify in Java?.

+0

Вы уже проверили этот код? Похоже, что это приведет к тому, что поток отправки событий Swing будет * ждать *, а это означает, что весь графический интерфейс должен зависнуть. Я не уверен, что это то поведение, которое предлагает OP. –

+0

Нет, я не тестировал его. Но только тот поток, который вызвал метод public void whatever(), будет ждать, пока метод actionPerformed будет вызван из другого потока. Если диспетчер swing называет «любой» метод, да. то поток диспетчера будет зависать. Но поток, который вызывает actionPerformed(), будет зависать только в ожидании, чтобы получить блокировку на объекте «timer». – Timmeey

+0

uhm .. спасибо вам оба: я попробовал это, и этот парень прав. Он замораживает .. Мне нужна метка для обратного отсчета – user7419985

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

  • Нет связанных вопросов^_^