简体   繁体   English

密钥侦听器无法正常工作

[英]The Key Listener Is not working properly

I made the Card Layout Working completely fine but what happened now is I added a keylistener to the object character which is a JLabel so whenever the person presses up the character should move up but it does absolutely nothing! 我使Card Layout完全正常工作,但是现在发生的是我在对象角色JLabel上添加了一个侦听器,因此每当有人按下该角色时,该角色都应向上移动,但绝对不起作用!

I also tried replacing it with a button which moves it when clicked and it worked completely fine. 我还尝试过用按钮替换它,该按钮在单击时可以移动它,并且效果很好。 Also I tried changing the event meaning I changed that if they press up then the image of the town map would change but still no effect so it seems there is something wrong with my KeyListener 我也尝试更改事件,这意味着我改变了,如果他们按一下,那么城镇地图的图像会发生变化,但仍然没有效果,因此我的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 我的KeyListener似乎有问题

A KeyEvent is only generated for the component with focus. 仅为具有焦点的组件生成KeyEvent。 A JLabel is not focusable by default so it will never receive any events. JLabel在默认情况下是无法聚焦的,因此它将永远不会收到任何事件。

Don't use a KeyListener. 不要使用KeyListener。

Instead you should be using Key Bindings . 相反,您应该使用Key Bindings

See Motion Using the Keyboard for working examples of using Key Bindings that does exactly what you want. 有关使用键盘 Key Bindings示例,请参见使用键盘运动

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM