Java KeyListener不工作,即使它看起来是正确的

Java KeyListener不工作,即使它看起来是正确的,java,android,swing,Java,Android,Swing,在编写程序时,我发现由于某种原因,我的按键方法没有任何作用。代码如下: import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagLayout; import java.awt.RenderingHints; import java.awt.

在编写程序时,我发现由于某种原因,我的按键方法没有任何作用。代码如下:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridBagLayout;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main extends JPanel implements KeyListener{

    Environment environment = new Environment();
    Cube cube = new Cube();



    public void paint(Graphics g) {

        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);

        environment.createBox(g2d);
        cube.createCube(g2d);

    }


    @Override
    public void keyPressed(KeyEvent e) {

        if (e.getKeyCode() == KeyEvent.VK_ESCAPE){
            cube.cube.setLocation(cube.x + 200, cube.y);
        }
    }

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

    }

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

    }




    public static void main(String[] args) throws InterruptedException {

        JFrame frame = new JFrame();


        Main m = new Main();

        m.addKeyListener(m);

        frame.add(m);

        frame.setSize(700, 1000);
        frame.setVisible(true);
        frame.setTitle("The Cube");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setResizable(true);
        frame.setLocationRelativeTo(null);

        frame.setBackground(new Color(240, 84, 84));

        while (true) {
            m.repaint();
            Thread.sleep(10);
        }

    }
}

我非常感谢您的帮助,因为我已经搜索了一周了,真的找不到解决方案。

这可能是因为您的面板是可聚焦的。尝试添加
m.setFocusable(true)
,然后单击面板。然后它应该拦截关键事件。

在上面创建一个构造函数:

Main()
{
    addKeyListener(this);
}

我设法找到了一个地方,然而,立方体似乎只是变得越来越大,而不是移动。 以下是两个课程:

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.FlowLayout;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GridBagLayout;
    import java.awt.RenderingHints;
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;

    import javax.swing.JFrame;
    import javax.swing.JPanel;

    public class Main extends JPanel implements KeyListener {

        Environment environment = new Environment();
        Cube cube = new Cube();

        private int x = 200;
        private int y = 620;

        public Main() {
            addKeyListener(this);
        }

        public void paint(Graphics g) {

            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);

            environment.createBox(g2d);
            cube.createCube(g2d, x, y);

        }

        public void moveCube() {
            x = x + 1;
            y = y + 1;
        }

        @Override
        public void keyPressed(KeyEvent e) {

            if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
                cube.cube.setLocation(x = x + 3, y = y);
            }
        }

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

        }

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

        }

        public static void main(String[] args) throws InterruptedException {

            JFrame frame = new JFrame();

            Main m = new Main();
            m.setFocusable(true);

            frame.add(m);

            frame.setSize(700, 1000);
            frame.setVisible(true);
            frame.setTitle("The Cube");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setResizable(true);
            frame.setLocationRelativeTo(null);

            frame.setBackground(new Color(240, 84, 84));

            while (true) {

                m.repaint();
                Thread.sleep(3);
            }

        }
    }

    import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

    public class Cube {

        public Rectangle cube;


        public void createCube(Graphics2D g2d, int x, int y){

            cube = new Rectangle(100, 800, x, y);

            g2d.setColor(new Color(148, 235, 148));

            g2d.fill(cube);

        }


    }

谢谢你的帮助!:)

您忘记将侦听器与任何容器关联。谢谢您的回答,但我仍然有相同的问题。也许我忘了其他东西?为什么要创建一个主对象?就像单击立方体一样?如果是这样,我很抱歉,但它不起作用。非常感谢您的回答:)