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