Key Listener 工作不正常

The Key Listener Is not working properly

我让 Card Layout 工作得很好,但现在发生的是我向对象角色添加了一个 keylistener,它是一个 JLabel,所以每当人按下时,角色应该向上移动,但它什么也没做!

我也尝试用一个按钮替换它,点击它时它会移动,而且效果很好。我还尝试更改事件,这意味着我更改了如果他们向上按,那么城镇地图的图像会改变但仍然没有效果所以我的 KeyListener 似乎有问题

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.*;
import javax.swing.*;


@SuppressWarnings({ "unused", "serial" })
public class FinalBlowzXC extends JFrame implements KeyListener{

    public static JPanel game=new JPanel();
    public static JPanel mainmenu=new JPanel(null);
    public static JPanel loginpanel=new JPanel(null);
    public static JPanel tutorial=new JPanel(null);
    public static JPanel registration=new JPanel(null);
    public static JPanel town_map=new JPanel(null);
    public JTextField username= new JTextField("Username");
    public JTextField password=new JTextField("Password");
    public  JLabel bglogin=new JLabel();
    public JLabel character=new JLabel();
    public  JButton log_in=new JButton();
    public  JButton register=new JButton();
    CardLayout page= new CardLayout();
    public String level="";
    public int charx=350;
    public int chary=435;

    public static void main(String []args)
    {
        new FinalBlowzXC().setVisible(true);
    }

    public FinalBlowzXC()
    {
        super("Final Blowz Xchanged");
        setSize(640,510);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);

        game.setLayout(page);
        game.add(mainmenu, "1");
        game.add(loginpanel, "2");
        game.add(tutorial, "3");
        game.add(registration, "4");
        game.add(town_map, "5");
        add(game);
        opening();
    }

        public void opening()
        {
            page.show(game, "1");
            JLabel bgmainmenu;
            JButton start;
            JButton exit;
            bgmainmenu = new JLabel();
            start = new JButton();
            exit = new JButton();

            bgmainmenu.setIcon(new ImageIcon(getClass().getResource("/FF-XV.jpg")));
            bgmainmenu.setBounds(0,0,640,480);
            mainmenu.add(bgmainmenu);
            mainmenu.add(start);
            start.setBounds(280, 360, 70, 20);
            start.setBorder(null);
            start.setBorderPainted(false);
            start.setContentAreaFilled(false);
            start.setOpaque(false);
            start.addActionListener(new Start());
            exit.setBounds(280, 385, 70, 20);
            mainmenu.add(exit);
            exit.setBorder(null);
            exit.setBorderPainted(false);
            exit.setContentAreaFilled(false);
            exit.setOpaque(false);
            exit.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e)
                {
                    System.exit(0);
                }
            });
        }


        class Start implements ActionListener{

        public void actionPerformed(ActionEvent e) {    
                login();

        }

    }

        public void login()
        {
            page.show(game, "2");

            bglogin.setIcon(new ImageIcon(getClass().getResource("/FF-XV Login.jpg")));
            bglogin.setBounds(0, 0, 640, 480);


            username.setBounds(300, 285, 85, 15);
            username.setBorder(null);
            username.setForeground(Color.WHITE);
            username.setOpaque(false);

            password.setBounds(300, 310, 85, 20);
            password.setBorder(null);
            password.setForeground(Color.WHITE);
            password.setOpaque(false);

            log_in.setBounds(280, 335, 50, 45);
            log_in.setBorder(null);
            log_in.setBorderPainted(false);
            log_in.setContentAreaFilled(false);
            log_in.setOpaque(false);
            log_in.addActionListener(new Log_in());

            register.setBounds(335, 335, 55, 45);
            register.setBorder(null);
            register.setBorderPainted(false);
            register.setContentAreaFilled(false);
            register.setOpaque(false);
            register.addActionListener(new Register());

            loginpanel.add(username);
            loginpanel.add(password);
            loginpanel.add(bglogin);
            loginpanel.add(log_in);
            loginpanel.add(register);
        }

        class Log_in implements ActionListener{

            public void actionPerformed(ActionEvent e) 
            {
                Tutorial();

            }

        }

        class Register implements ActionListener{

            public void actionPerformed(ActionEvent e)
            {
                page.show(game, "4");
            }
        }

        public void Tutorial()
        {
            page.show(game, "3");
            JLabel bgtutorial=new JLabel();
            JLabel animeforward=new JLabel();
            JLabel animeright=new JLabel();
            JLabel animeleft=new JLabel();
            JButton next=new JButton();
            JLabel animebackward=new JLabel();
            bgtutorial.setIcon(new ImageIcon(getClass().getResource("/FF-XV Tutorial.jpg")));
            bgtutorial.setBounds(0, 0, 640, 480);
            animeforward.setIcon(new ImageIcon(getClass().getResource("walkanimofficialfront.gif")));
            animeforward.setBounds(115, 230, 30, 30);
            animeright.setIcon(new ImageIcon(getClass().getResource("walkanimofficialright.gif")));
            animeright.setBounds(190, 315, 30, 30);
            animeleft.setIcon(new ImageIcon(getClass().getResource("walkanimofficialleft.gif")));
            animeleft.setBounds(45, 315, 30, 30);
            animebackward.setIcon(new ImageIcon(getClass().getResource("walkanimofficialback.gif")));
            animebackward.setBounds(115, 405, 30, 30);
            next.setBounds(530, 430, 100, 30);
            next.setBorder(null);
            next.setBorderPainted(false);
            next.setContentAreaFilled(false);
            next.setOpaque(false);
            next.addActionListener(new Next());
            tutorial.add(next);
            tutorial.add(animeright);
            tutorial.add(animeleft);
            tutorial.add(animebackward);
            tutorial.add(animeforward);
            tutorial.add(bgtutorial);

        }

        class Next implements ActionListener{

            public void actionPerformed(ActionEvent e)
            {
                town();
            }
        }

        public void town()
        {
            page.show(game, "5");
            JLabel map=new JLabel();
            map.setIcon(new ImageIcon(getClass().getResource("/FF-XV Town.jpg")));
            map.setBounds(0, 0, 640, 480);
            character.setIcon(new  ImageIcon(getClass().getResource("standfront.png")));
            character.setBounds(charx, chary, 30, 35);
            town_map.add(character);
            town_map.add(map);

        }   


        public void keyPressed(KeyEvent e) {
            if(e.getKeyCode()==KeyEvent.VK_UP)
            {
                character.setIcon(new ImageIcon(getClass().getResource("walkanimofficialfront.gif")));
                character.setLocation(character.getX(), character.getY()+5);
            }

            if(e.getKeyCode()==KeyEvent.VK_RIGHT)
            {
                character.setIcon(new ImageIcon(getClass().getResource("walkanimofficialright.gif")));
                character.setLocation(character.getX()+5, character.getY());
            }

            if(e.getKeyCode()==KeyEvent.VK_LEFT)
            {
                character.setIcon(new ImageIcon(getClass().getResource("walkanimofficialleft.gif")));
                character.setLocation(character.getX()-5, character.getY()+5);
            }

            if(e.getKeyCode()==KeyEvent.VK_DOWN)
            {
                character.setIcon(new ImageIcon(getClass().getResource("walkanimofficialback.gif")));
                character.setLocation(character.getX(), character.getY()-5);
            }

        }


        public void keyReleased(KeyEvent e) {


        }

        public void keyTyped(KeyEvent e) {


        }
}

it seems there is something wrong with my KeyListener

只为具有焦点的组件生成 KeyEvent。默认情况下,JLabel 不可聚焦,因此它永远不会接收任何事件。

不要使用 KeyListener。

您应该使用 Key Bindings

请参阅 Motion Using the Keyboard 了解使用 Key Bindings 的工作示例,它完全符合您的要求。