关键监听器工作不正常

Posted

技术标签:

【中文标题】关键监听器工作不正常【英文标题】:The Key Listener Is not working properly 【发布时间】:2017-05-17 02:09:07 【问题描述】:

我使卡片布局工作完全正常,但现在发生的事情是我向对象角色添加了一个按键监听器,它是一个 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) 


        

【问题讨论】:

【参考方案1】:

我的 KeyListener 好像有问题

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

不要使用 KeyListener。

您应该使用Key Bindings

有关使用 Key Bindings 的工作示例,请参阅 Motion Using the Keyboard,这正是您想要的。

【讨论】:

我尝试学习但无法理解,而且我没有太多时间,因为它很快就会到期所以有没有办法使用关键监听器通过聚焦来移动标签左右?? @AgentSmith,我给了你使用这两种方法的工作示例。

以上是关于关键监听器工作不正常的主要内容,如果未能解决你的问题,请参考以下文章

触摸监听器不工作android

当用户关闭屏幕android时,使应用程序正常工作

PayPal IPN 模拟器工作正常,但 IPN 不响应沙盒支付

InterstitialAd监听器onAdClicked无法正常工作

ZeroMq PUB/SUB 模式无法正常工作

SessionManagerListener 不工作