2012-07-17 2 views
0

Я немного борюсь с этим. После исследования на Google Я создал следующую рутину таймера, который хорошо работает при вызовенужна помощь по установке метода таймера за JToggleButton

// play move method 
public static void playMove() { 
    int delay = 1200; // delay for 1 sec. 
    int period = 1200; // repeat every sec. 

    final Timer timer = new Timer(); 
    timer.schedule(new TimerTask() { 
     private int count = history.getGameIndex(); 

     public void run() { 
      count++; 
      if (count >= history.getTotalMoves() + 1) { 
       timer.cancel(); 
       timer.purge(); 
       return; 
      } 
      history.next(); 
     } 
    }, delay, period); 
} 

Однако, проблема в том, что я не могу понять, как интегрировать этот код в JToggleButton который является правильным местом для этого так что, когда я нажимаю кнопку воспроизведения, он играет ход, и когда я нажимаю stop, останавливает (или приостанавливает) процедуру. Вот мой JToggleButton код:

ImageIcon playIcon = new ImageIcon(
     JBoard.class.getResource("/images/menu/play.png")); 

btnPlayMove = new JToggleButton(playIcon); 
btnPlayMove.setToolTipText("Play"); 
btnPlayMove.setContentAreaFilled(true); 
btnPlayMove.setMargin(new Insets(2, 2, 2, 2)); 

btnPlayMove.addItemListener(new ItemListener() { 
    public void itemStateChanged(ItemEvent ie) { 
     if (isConnected()) { 
      showMessage("Engine disabled during network play..."); 
      return; 
     } else if (btnPlayMove.isSelected()) { 
      // play 
      playMove(); 
      ImageIcon playIcon = new ImageIcon(JBoard.class 
        .getResource("/images/menu/play.png")); 
      btnPlayMove.setIcon(playIcon); 
     } else { 
      // stop 
      ImageIcon stop = new ImageIcon(JBoard.class 
        .getResource("/images/menu/stop.png")); 
      btnPlayMove.setIcon(stop); 

     } 
    } 
}); 
buttonPanel.add(btnPlayMove); 

Я довольно новый для Java, и было бы здорово, если бы кто-то может помочь

ответ

1

Вы можете воспользоваться javax.swing.Timer

Timer timer = new Timer(1200, new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     count++; 
     if (count >= history.getTotalMoves() + 1) { 
      timer.cancel(); 
      timer.purge(); 
      return; 
     } 
     history.next(); 
    } 
}); 

timer.setRepeats(true); 
timer.setCoalesce(true); 
timer.setInitialDelay(1200); 

Тогда в вас код кнопки вы бы просто позвонить timer.start() или timer.stop()

+0

MadProgrammer: Спасибо за ваш код. Я понимаю, что вы имеете в виду с вашим подходом, однако я не могу заставить ваш код работать. Я помещаю его в свой класс, но Eclipse продолжает указывать мне, чтобы удалить Аргументы для соответствия «Timer()»? Где именно я помещаю код в отношении моих методов? – user1432365

+0

Убедитесь, что вы используете javax.swing.Timer & not java.util.Timer – MadProgrammer

+0

Да, я использовал java.util.Timer ... doh !! Работаю сейчас :-). Еще раз спасибо. – user1432365

0

Я хотел бы предложить вам сделать метод playMovie нестатического & объявлять историю как глобальные переменные & включить в качели класс:

History history = new History(); // assuming this with no-args 

public void playMove() { 
     int delay = 1200; // delay for 1 sec. 
     // etc. 
     // etc. 
} 

Кроме того, вам нужно будет программно остановить playMove(), если его TimerTask нить все еще работает.