向KeyListener添加计时器

时间:2015-06-01 01:17:29

标签: java timer keylistener

我扩展了一个JFrame类,并将自己的模型和JPanel扩展类作为实例变量。我将KeyListener实现到了我的JFrame,它使用了箭头键,但是当我按住键时,我的模型在帧周围移动的速度非常慢。我的问题是如何将KeyListener方法附加到计时器或执行某些操作以使我的模型在按住键时移动得更快。如果可能的话,模型如何一次移动两个方向,比如说左起还是上升?

public class GameController extends JFrame implements KeyListener,ActionListener
{
    private GamePieces p;
    private GamePanel panel;
    private Timer timer;

    public GameController()
    {
        super("Balls");
        setSize(800, 600);
        timer = new Timer(10, this);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
        Container c = getContentPane();
        c.setLayout(new BorderLayout());

        p = new GamePieces();
        panel = new GamePanel();

        p.addObserver(panel);

        c.add(panel);

        addKeyListener(this);

        panel.update(p, null);

        setResizable(false);
        timer.start();
    }

    public void actionPerformed(ActionEvent e) 
    {
        String actionCommand = e.getActionCommand();
        if (e.getSource() == timer)
        {
            p.checkEat();
            p.moveOthers();
            panel.update(p, null);
        }
    }

    public void keyTyped(KeyEvent e)
    {
        int s = 0;
    } 

    public void keyPressed(KeyEvent e)
    {
        int key = e.getKeyCode();
        if (key==38)
        {
            p.up();
            panel.update(p, null);
        }
        else if (key==40)
        {
            p.down();
            panel.update(p, null);
        }
        else if (key==39)
        {
            p.right();
            panel.update(p, null);
        }
        else if (key==37)
        {
            p.left();
            panel.update(p, null);
        }
    }

    public void keyReleased(KeyEvent e)
    {
        int o = 0;
    }

    public static void main(String[]args)
    {
        GameController a = new GameController();
        a.setVisible(true);
    }
}

1 个答案:

答案 0 :(得分:0)

你是正确的,但它应该更复杂一点。遵循MVC模式。你应该有模型来记住你的面板应该在哪里 - up(),down()方法只更新这个模型。你应该有查看器,它显示当前位置的面板。 panel.update()属于viewer。然后你应该有控制器来改变位置(上下左右调用它们)并在必要时调用查看器 - 显示移动或仅显示下一帧。

当按下键时,KeyListener告诉控制器在某些时间间隔内移动位置。然后它告诉控制器在释放密钥时停止这样做。看,所有部件都能平稳独立地移动。 Keylistener告诉控制器要做什么,控制器做 - 改变模型并调用查看器。模型什么都不做 - 只保存数据。 Viewer不会只显示当前数据。

P.S。不要忘记线程安全,因为您将按下多个键,它们将在同一个线程中多次调用控制器。