【问题标题】:KeyListener Not Working even though it seems correct即使看起来正确,KeyListener 也不起作用
【发布时间】:2015-03-22 17:06:53
【问题描述】:

在编写程序时,我发现由于某种原因我的 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);
        }

    }
}

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

【问题讨论】:

  • 您忘记将侦听器与任何容器关联。

标签: java android swing


【解决方案1】:

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

【讨论】:

  • 就像点击立方体一样?如果是这样,我很抱歉,但它不起作用。不过非常感谢您的回答:)
【解决方案2】:

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

Main()
{
    addKeyListener(this);
}

【讨论】:

  • 感谢您的回答,但我仍然遇到同样的问题。也许我忘记了别的东西?
  • 为什么要创建一个主对象?
【解决方案3】:

我设法到达了某个地方,但是,立方体似乎只是变大而不是移动。 这是两个类:

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

        }


    }

感谢大家的帮助! :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 2023-03-18
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    相关资源
    最近更新 更多