【问题标题】:Adding a timer to KeyListener向 KeyListener 添加计时器
【发布时间】:2015-06-01 01:17:29
【问题描述】:

我扩展了一个 JFrame 类,并将我自己的模型和 JPanel 扩展类作为实例变量。我在我的 JFrame 中实现了 KeyListener,它与箭头键一起工作,但是当我按住键时,我的模型在框架周围移动得非常慢。我的问题是如何将 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);
    }
}

【问题讨论】:

  • 不要使用幻数。你从哪里猜到 37、38、39 和 40 是什么意思?不要使用 KeyListener。相反,您可以使用Key Bindingshow can the model move two directions at onceMotion Using the Keyboard 中的 KeyboardAnimation.java 示例展示了如何使用键绑定来做到这一点。

标签: java timer keylistener


【解决方案1】:

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

您的 KeyListener 告诉控制器在按下键时以一定间隔移动位置。然后它告诉控制器在释放键时停止这样做。看,所有部分都平稳而独立地移动。 Keylistener 告诉控制器做什么,控制器做什么 - 更改模型并调用查看器。模型什么都不做——只保存数据。 Viewer 什么都不做,只显示当前数据。

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

【讨论】:

    猜你喜欢
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-02
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多