Запуск и остановка таймера по нажатию кнопки - Java

Узнай цену своей работы

Формулировка задачи:

Добрый день. Прошу подсказать. Есть такая программка
Листинг программы
  1. public class moving_test extends JFrame {
  2. public moving_test(){
  3. myPanel np=new myPanel();
  4. Container cont=getContentPane();
  5. cont.add(np);
  6. this.setTitle("Теннис");
  7. this.setBounds(100,100,800,600);
  8. np.l1.setBounds(50, 10, 100, 20);
  9. np.l2.setBounds(500, 100, 100, 20);
  10. np.l1.setText("0");
  11. np.l2.setText("0");
  12. np.add(np.l1);
  13. np.add(np.l2);
  14. np.btnstart.setLabel("Начать игру");
  15. np.btnstart.setBounds(10, 10, 100, 100);
  16. np.btnend.setLabel("Остановить игру");
  17. np.btnend.addActionListener(new java.awt.event.ActionListener() {
  18. public void actionPerformed(ActionEvent e) {
  19. setLocation(200, 100);
  20. np.nt.restart();
  21. }
  22. });
  23. np.btnstart.addActionListener(new java.awt.event.ActionListener() {
  24. public void actionPerformed(ActionEvent e) {
  25. setLocation(100, 100);
  26. np.nt.restart();
  27. }
  28. });
  29. np.btnend.setBounds(10, 10, 100, 100);
  30. np.add(np.btnend);
  31. //np.btnstart.enable(false);
  32. np.add(np.btnstart);
  33. setVisible(true);
  34. setBackground(Color.LIGHT_GRAY);
  35. //np.nt.stop();
  36. this.validate(); // обновляем фрейм
  37. }
  38. class myPanel extends JPanel
  39. {
  40. private int x=785,y=300;
  41. private int napr=111;
  42. public Button btnstart = new Button();
  43. public Button btnend = new Button();
  44. public Label l1 = new Label();
  45. public Label l2 = new Label();
  46. public Timer nt;
  47. private class myKey implements KeyListener
  48. {
  49. public void keyPressed(KeyEvent e)
  50. {
  51. int key_= e.getKeyCode();
  52. if (key_==KeyEvent.VK_UP)napr=11;
  53. if (key_==KeyEvent.VK_DOWN)napr=33;
  54. }
  55. public void keyReleased(KeyEvent e){
  56. }
  57. public void keyTyped(KeyEvent e){}
  58. }
  59. public myPanel()
  60. {
  61. addKeyListener(new myKey());
  62. setFocusable(true);
  63. Timer nt = new Timer(20,new ActionListener()
  64. {
  65. public void actionPerformed(ActionEvent e)
  66. {
  67. if (napr==11) y-=12;
  68. if (napr==1) y--;
  69. if (napr==33) y+=12;
  70. if (napr==3) y++;
  71. if ((napr==1) && (y<=0)) {
  72. napr=3;
  73. y=0;
  74. }
  75. if ((napr==3) && (y>=480)) {
  76. y=480;
  77. napr=1;
  78. }
  79. if ((napr==11) && (y<=0)) {
  80. y=0;
  81. napr=3;
  82. }
  83. if ((napr==33) && (y>=480)) {
  84. y=480;
  85. napr=1;
  86. }
  87. repaint();
  88. }
  89. });
  90. nt.start();
  91. }
  92. public void paintComponent(Graphics gr)
  93. {
  94. gr.setColor(Color.RED);
  95. gr.fillRect(x,y,10,80);
  96. gr.setColor(Color.LIGHT_GRAY);
  97. if (napr==3) gr.fillRect(x,y-80,10,80); else if (napr==1) gr.fillRect(x,y+80,10,80);
  98. if (napr==33) gr.fillRect(x,y-80,10,80); else if (napr==11) gr.fillRect(x,y+80,10,80);
  99. }
  100. }
  101. public static void main(String[] args) {
  102. moving_test okno = new moving_test();
  103. okno.setLocation(100, 100);
  104. okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  105. okno.setResizable(false);
  106. okno.setVisible(true);
  107. }
  108. }
В ней хочу кнопками остановить и заново запустить таймер. Но он не останавливается, точнее как-то неправильно реагирует. Затем не запускается. Предполагаю, что не нужно его было запихивать в конструктор панели. Или все же с ним можно там работать? Т.е. как при нажатии одной кнопки остановить все, при нажатии другой - переинциализировать и запустить. Спасибо.
как пользоваться таймером - понятно, интересует особенность именно как пользоваться в данном случае. Почему при стопе нет опроса клавиатуры, но продолжается движение, при старте - не возобновляется опрос

Решение задачи: «Запуск и остановка таймера по нажатию кнопки»

textual
Листинг программы
  1.  class running implements Runnable
  2.     {
  3.         long delta =0;
  4.  
  5.         @Override
  6.         public void run()
  7.         {
  8.           long lastTime = System.currentTimeMillis();
  9.          
  10.  
  11.       while(!stop)
  12.            {
  13.               delta++;//= System.currentTimeMillis() - lastTime; //разница по времени между двумя кадрами
  14.               lastTime = System.currentTimeMillis();
  15.                 //ваш код по таймеру относительно дельта, где дельта миллисекунды.
  16.             }
  17.       }
  18. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 3.6 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы