java - 鼠标监听器和按键

标签 java swing jframe keylistener mouselistener

我构建了一个简单的动画程序,可以根据 在 JFrame 中使用 KeyListenerActionListener 按下箭头键(类似于蛇)。但我注意到,如果我启动应用程序并移动鼠标,应用程序将不会继续检查按下了哪个箭头键以及移动到哪个方向。

有人可以向我解释一下这一点吗?是因为我需要禁用涉及鼠标事件的某些内容吗?

这是代码:

public class gui extends JPanel implements ActionListener, KeyListener{
    Timer tm = new Timer(5, this);
    int x = 300, y = 178, velx = 0, vely = 0;


    public gui() {
        tm.start();
        addKeyListener(this);
        setFocusable(true);
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(x, y, 50, 30);

    }

    @Override
    public void keyPressed(KeyEvent e) {
        keys(e);
    }

    public void keys(KeyEvent e) {
        int c = e.getKeyCode();
        if (c == KeyEvent.VK_LEFT)

        {
            velx = -1;
            vely = 0;
        }
        if (c == KeyEvent.VK_UP)

        {
            velx = 0;
            vely = -1;
        }
        if (c == KeyEvent.VK_RIGHT)

        {
            velx = 1;
            vely = 0;
        }
        if (c == KeyEvent.VK_DOWN)

        {
            velx = 0;
            vely = 1;

        }
    }

    public void borders(ActionEvent e) {
        if (x < 0) {
            velx = 0;
            x = 0;
            JOptionPane
                    .showMessageDialog(null, "you hit the borders you lost!");
            System.exit(0);
        }
        if (x > 530) {
            velx = 0;
            x = 530;
            JOptionPane
                    .showMessageDialog(null, "you hit the borders you lost!");
            System.exit(0);
        }
        if (y < 0) {
            velx = 0;
            y = 0;
            JOptionPane
                    .showMessageDialog(null, "you hit the borders you lost!");
            System.exit(0);
        }
        if (y > 330) {
            velx = 0;
            y = 330;
            JOptionPane
                    .showMessageDialog(null, "you hit the borders you lost!");
            System.exit(0);

        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub

    }


    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub

    }


    public void actionPerformed(ActionEvent e) {
        x += velx;
        y += vely;
        repaint();
        borders(e);

    }

}

最佳答案

不知道你的问题是什么。我使用了你的代码,没有任何问题。

这是我使用的:

        public gui() 
        {
            addKeyListener(this);
            setFocusable(true);
        }

        public void keyPressed(KeyEvent e)
        {
            int c = e.getKeyCode();
            if (c == KeyEvent.VK_LEFT)
            {
                velx = -1;
                vely = 0;
            }
            if (c == KeyEvent.VK_UP)
            {
                velx = 0;
                vely = -1;
            }
            if (c == KeyEvent.VK_RIGHT)
            {
                velx = 1;
                vely = 0;
            }
            if (c == KeyEvent.VK_DOWN)
            {
                velx = 0;
                vely = 1;
            }
        }

        public void actionPerformed(ActionEvent e)
        {
            x += velx;
            y += vely;
            repaint();
            borders(e);
        }

        public static void main(String[] args)
        {
            JFrame frame = new JFrame("gui");
            frame.add(new gui());
            frame.setVisible(true);
            frame.setSize(600, 400);
        }
    }

我在启动程序之前点击了鼠标并移动了它,然后我使用了按键;效果很好。不过我会切换到 KeyBindings。

关于java - 鼠标监听器和按键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12756303/

相关文章:

java - 将 GitHub 库导入现有 Eclipse 项目

java - 黑莓自定义 ListField 未以正确的方式重新绘制

java - Java servlet 的 JUnit 测试 : java. lang.NullPointerException

java - 使用数组绘制 jFreechart 时出现问题

java - JFrame 未正确加载

java - 动态改变JBouton的位置

java - 在没有上下文路径的情况下访问 Java 应用程序

java:如何才能看到 JScrollPane 的后面?

java - 如何一次更改已分配字体的多个组件中的字体?

java - 在位置设置按钮和 TextAreas