KeyListener不起作用,尽管它看起来是正确的。

3
在我的程序中工作时,我发现由于某种原因,我的KeyPressed方法没有任何反应。下面是代码:
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);
        }

    }
}

我非常感激您的帮助,因为我已经搜索了一周,但仍无法找到解决方案。

1
你忘记将监听器与任何容器关联。 - SMA
3个回答

0
创建一个构造函数如下所示:
Main()
{
    addKeyListener(this);
}

谢谢你的回答,但我仍然遇到同样的问题。也许我忘记了其他什么? - Pet Lamb
你为什么创建了一个主对象? - Burak Karasoy

0

我设法做了一些进展,但是这个立方体似乎只会变得越来越大而不是移动。

以下是两个类:

    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);

        }


    }

感谢所有的帮助!:)


0

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


点击方块吗?如果是的话,很抱歉它不起作用。非常感谢您的回答 :) - Pet Lamb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接