下面是我用来测试的小程序,很简单,字母'A'通过Timer不断向上移动,当按“↑”的时候,改变Timer中的延时(原为1500ms)
按“↑”时先令Timer停止,然后改变延时(t.setDelay(t.getDelay() / 3);),再启动Timer
问题来了,这时字母'A'应该是停顿t.getDelay() / 3的延时再向上移动,但为什么每次按“↑”时,停顿的时间都是原来的延时1500ms?若要达到我想要的效果,并且不在KeyListener中new一个Timer,应如何改动?class Panel_13 extends JPanel
{
public Panel_13()
{
final Timer t = new Timer(1500, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(y > 10)
y -=10;
repaint();
}
});
t.start(); addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent event)
{
t.stop();
if(event.getKeyCode() == KeyEvent.VK_UP && y > 10)
{
t.setDelay(t.getDelay() / 3);
y -= 10;
}
repaint();
t.start();
}
});
} protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setFont(new Font("TimesRoman", Font.PLAIN, 24));
g.drawString("A", 45, y);
} private int y = 360;
}
按“↑”时先令Timer停止,然后改变延时(t.setDelay(t.getDelay() / 3);),再启动Timer
问题来了,这时字母'A'应该是停顿t.getDelay() / 3的延时再向上移动,但为什么每次按“↑”时,停顿的时间都是原来的延时1500ms?若要达到我想要的效果,并且不在KeyListener中new一个Timer,应如何改动?class Panel_13 extends JPanel
{
public Panel_13()
{
final Timer t = new Timer(1500, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(y > 10)
y -=10;
repaint();
}
});
t.start(); addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent event)
{
t.stop();
if(event.getKeyCode() == KeyEvent.VK_UP && y > 10)
{
t.setDelay(t.getDelay() / 3);
y -= 10;
}
repaint();
t.start();
}
});
} protected void paintComponent(Graphics g)
{
super.paintComponent(g);
g.setFont(new Font("TimesRoman", Font.PLAIN, 24));
g.drawString("A", 45, y);
} private int y = 360;
}
setFocusable()为true在创建Panel_13这个类时已经有了
问题是Timer那个延时
如果将KeyListener事件改成这样、addKeyListener(new KeyAdapter()
{
public void keyPressed(KeyEvent event)
{
t.stop();
if(event.getKeyCode() == KeyEvent.VK_UP && y > 10)
{
y -= 10;
t = new Timer(t.getDelay() / 3, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(y > 10)
y -=10;
repaint();
}
});
}
t.start();
repaint();
}
});
private Timer t;
此时,字母‘A’停顿的时间就是t.getDelay() / 3。