Запуск и остановка таймера по нажатию кнопки - 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(); //ваш код по таймеру относительно дельта, где дельта миллисекунды. } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д