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

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

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

Добрый день. Прошу подсказать. Есть такая программка
public class moving_test extends JFrame {
    public moving_test(){
        myPanel np=new myPanel();
        Container cont=getContentPane();
        cont.add(np);
        this.setTitle("Теннис");    
        this.setBounds(100,100,800,600);
        np.l1.setBounds(50, 10, 100, 20);
        np.l2.setBounds(500, 100, 100, 20);
        np.l1.setText("0");
        np.l2.setText("0");
        np.add(np.l1);
        np.add(np.l2);
        np.btnstart.setLabel("Начать игру");
        np.btnstart.setBounds(10, 10, 100, 100);        
        np.btnend.setLabel("Остановить игру");      
        np.btnend.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setLocation(200, 100);
                np.nt.restart();
            }
        });
        np.btnstart.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(ActionEvent e) {
                setLocation(100, 100);
                np.nt.restart();
            }
        });
        np.btnend.setBounds(10, 10, 100, 100);
        np.add(np.btnend);
      //np.btnstart.enable(false);
        np.add(np.btnstart);
        setVisible(true);
        setBackground(Color.LIGHT_GRAY); 
      //np.nt.stop();        
        this.validate(); // обновляем фрейм
    }
    
    class myPanel extends JPanel
    {       
        private int x=785,y=300;    
        private int napr=111;
        public Button btnstart = new Button();
        public Button btnend = new Button();
        public Label l1 = new Label(); 
        public Label l2 = new Label();      
        public Timer nt;
    
        private class myKey implements KeyListener
        {
            public void keyPressed(KeyEvent e)
            {       
                int key_= e.getKeyCode();
                if (key_==KeyEvent.VK_UP)napr=11;
                if (key_==KeyEvent.VK_DOWN)napr=33;         
            }
            public void keyReleased(KeyEvent e){            
 
            }
            public void keyTyped(KeyEvent e){}  
        }
        
        public myPanel()
        {
        addKeyListener(new myKey());
        setFocusable(true);
        
        Timer nt = new Timer(20,new ActionListener()
        {           
            public void actionPerformed(ActionEvent e)          
            {           
                if (napr==11) y-=12;
                if (napr==1) y--;        
                if (napr==33) y+=12;
                if (napr==3) y++;               
                if ((napr==1) && (y<=0)) {
                    napr=3;
                    y=0;
                }
                if ((napr==3) && (y>=480)) {
                    y=480;
                    napr=1;
                }           
                if ((napr==11) && (y<=0)) {
                    y=0;
                    napr=3;
                }       
                if ((napr==33) && (y>=480)) {
                    y=480;
                    napr=1;
                }   
                repaint();
          }
        });
    nt.start();
    }
 
    public void paintComponent(Graphics gr)
    {
        gr.setColor(Color.RED);
        gr.fillRect(x,y,10,80);
        gr.setColor(Color.LIGHT_GRAY);
        if (napr==3) gr.fillRect(x,y-80,10,80); else if (napr==1) gr.fillRect(x,y+80,10,80);
        if (napr==33) gr.fillRect(x,y-80,10,80); else if (napr==11) gr.fillRect(x,y+80,10,80);
      }  
    }  
        
    public static void main(String[] args) {
        moving_test okno = new moving_test();
        okno.setLocation(100, 100);
        okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        okno.setResizable(false);
        okno.setVisible(true);  
    }
}
В ней хочу кнопками остановить и заново запустить таймер. Но он не останавливается, точнее как-то неправильно реагирует. Затем не запускается. Предполагаю, что не нужно его было запихивать в конструктор панели. Или все же с ним можно там работать? Т.е. как при нажатии одной кнопки остановить все, при нажатии другой - переинциализировать и запустить. Спасибо.
как пользоваться таймером - понятно, интересует особенность именно как пользоваться в данном случае. Почему при стопе нет опроса клавиатуры, но продолжается движение, при старте - не возобновляется опрос

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

textual
Листинг программы
 class running implements Runnable
    {
        long delta =0;
 
        @Override
        public void run() 
        {
          long lastTime = System.currentTimeMillis();
          
 
      while(!stop) 
           {
              delta++;//= System.currentTimeMillis() - lastTime; //разница по времени между двумя кадрами
              lastTime = System.currentTimeMillis();
                //ваш код по таймеру относительно дельта, где дельта миллисекунды.
            }
      }
}

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


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

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

5   голосов , оценка 3.6 из 5
Похожие ответы