为什么我的KeyListener在向框架添加按钮后无法正常工作?

时间:2017-05-13 13:53:05

标签: java swing jbutton keylistener

当我删除setButton()并按键时,会有正确的反应,但如果我添加setButton(),只有按钮有效,按键没有反应,这里会发生什么?

public class Sokaban extends JFrame implements ActionListener {

    private static final long serialVersionUID = 1L;
    JButton btnBack,btnFirst,btnNext,btnPrev,btnLast,btnSelect,btnMusic,btnReset;
    JComboBox<String> cbMusic;
    JMenuBar menuBar;
    JMenu mnuOption,mnuSet,mnuHelp;
    JMenuItem miReset,miPrev,miNext,miSelect,miExit,miBack;
    JMenuItem miMusic1,miMusic2,miMusic3,miMusic4,miMusic5;
    JMenuItem miHelp;
    //music file
    String sMusic[] = {
        "eyes on me.mid",
        "guang.mid",
        "nor.mid",
        "popo.mid",
        "qin.mid"
    };
    //game panel
    MyPanel mainPanel;
    public Sokaban(int[][] samplemap){
        super("Game 2017");

        Toolkit toolkit = Toolkit.getDefaultToolkit();
        Image image = toolkit.getImage("pic/p0.jpg");
        //set icon
        this.setIconImage(image);
        Container c = this.getContentPane();
        c.setLayout(null);
        c.setBackground(Color.orange);

        JLabel lblTitle = new JLabel("SOKABAN GAME",JLabel.CENTER);
        lblTitle.setFont(new Font("",Font.BOLD,20));
        lblTitle.setBounds(100,40,500,30);
        c.add(lblTitle,BorderLayout.NORTH);
        //put buttons
        setButton(c);
        setMenus();

        mainPanel = new MyPanel(samplemap);
        mainPanel.setBounds(60,120,450,450);
        mainPanel.setFocusable(true);
        mainPanel.requestFocusInWindow();
        c.add(mainPanel);

        setSize(720,720);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);

    }

    //set button
    public void setButton(Container c){
        btnReset = new JButton("Reset");
        btnBack = new JButton("Back");
        btnFirst = new JButton("First");
        btnNext = new JButton("Next");
        btnPrev = new JButton("Prev");
        btnLast = new JButton("Last");
        btnSelect = new JButton("Select");
        btnMusic = new JButton("Music");
        JLabel lblMusic = new JLabel("Select Music");
        c.add(lblMusic);

        btnReset.addActionListener(this);
        btnBack.addActionListener(this);
        btnFirst.addActionListener(this);
        btnNext.addActionListener(this);
        btnPrev.addActionListener(this);
        btnLast.addActionListener(this);
        btnSelect.addActionListener(this);
        btnMusic.addActionListener(this);
        //cbMusic.addActionListener(this);

        cbMusic = new JComboBox<String>();
        cbMusic.addItem("default");
        cbMusic.addItem("good");
        cbMusic.addItem("music");
        cbMusic.addItem("choose");
        cbMusic.addItem("column");

        btnReset.setBounds(600,100,80,30);
        btnBack.setBounds(600,150,80,30);
        btnFirst.setBounds(600,200,80,30);
        btnNext.setBounds(600,250,80,30);
        btnPrev.setBounds(600,300,80,30);
        btnLast.setBounds(600,350,80,30);
        btnSelect.setBounds(600,400,80,30);
        btnMusic.setBounds(600,450,80,30);
        lblMusic.setBounds(600, 500, 80, 30);
        cbMusic.setBounds(600, 530, 80, 30);
        c.add(btnReset);
        c.add(btnBack);
        c.add(btnFirst);
        c.add(btnNext);
        c.add(btnPrev);
        c.add(btnLast);
        c.add(btnSelect);
        c.add(btnMusic);
        c.add(cbMusic);

    }


    //set menu
    public void setMenus(){
        mnuOption = new JMenu("Option");
         miReset = new JMenuItem("Reset");
         miPrev = new JMenuItem("Previous");
         miNext = new JMenuItem("Next");
         miSelect = new JMenuItem("Select");
         miExit = new JMenuItem("Exit");
         miBack = new JMenuItem("Back");

         mnuOption.add(miBack);
         mnuOption.add(miReset);
         mnuOption.add(miPrev);
         mnuOption.add(miNext);
         mnuOption.add(miSelect);
         mnuOption.addSeparator();
         mnuOption.add(miExit);

         mnuSet = new JMenu("Setting");
         miMusic1 = new JMenuItem("default");
         miMusic2 = new JMenuItem("good");
         miMusic3 = new JMenuItem("music");
         miMusic4 = new JMenuItem("choose");
         miMusic5 = new JMenuItem("column");
         mnuSet.add(miMusic1);
         mnuSet.add(miMusic2);
         mnuSet.add(miMusic3);
         mnuSet.add(miMusic4);
         mnuSet.add(miMusic5);

         mnuHelp = new JMenu("Help");
         mnuHelp.setMnemonic('H');
         miHelp = new JMenuItem("About us...");
         mnuHelp.add(miHelp);

         miBack.addActionListener(this);
         miReset.addActionListener(this);
         miPrev.addActionListener(this);
         miNext.addActionListener(this);
         miSelect.addActionListener(this);
         miMusic1.addActionListener(this);
         miMusic2.addActionListener(this);
         miMusic3.addActionListener(this);
         miMusic4.addActionListener(this);
         miMusic5.addActionListener(this);
         miHelp.addActionListener(this);

         menuBar = new JMenuBar();
         menuBar.add(mnuOption);
         menuBar.add(mnuSet);
         menuBar.add(mnuHelp);
         this.setJMenuBar(menuBar);

    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        if(e.getSource().equals(miHelp)){
            String str = "COMP2911\n";
            str +="Assignment3\n";
            JOptionPane.showMessageDialog(this, str, "Help", JOptionPane.INFORMATION_MESSAGE);
        } else if(e.getSource().equals(miExit)){
            System.exit(0);
        } else if(e.getSource().equals(btnReset)){
            System.out.println("reset the game");
        } else if(e.getSource().equals(btnBack)){
            System.out.println("get to the back stage");
        }
    }

    //game panel
    public class MyPanel extends JPanel implements KeyListener{
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        private int[][] oriMap;
        private int[][] tempMap;

        Toolkit kit = Toolkit.getDefaultToolkit();
        Image mapimg[] = {
            kit.getImage("pic/0.png"),
            kit.getImage("pic/1.gif"),
            kit.getImage("pic/2.png"),
            kit.getImage("pic/3.png"),
            kit.getImage("pic/4.gif"),
            kit.getImage("pic/5.GIF"),
            kit.getImage("pic/6.GIF"),
            kit.getImage("pic/7.GIF"),
            kit.getImage("pic/8.GIF"),
            kit.getImage("pic/9.png")
        };
        public int[][] getOriMap() {
            return oriMap;
        }
        public void setOriMap(int[][] oriMap) {
            this.oriMap = oriMap;
        }
        public MyPanel(int[][] map){
            readMap(map);
            setSize(600,600);
            this.addKeyListener(this);
            //this.setFocusable(true);
        //  requestFocus();
        //  repaint();
        }
        public void readMap(int[][] map){
            this.oriMap = map;
            this.tempMap = map;
        }
        @Override
        public void keyTyped(KeyEvent e) {
            // TODO Auto-generated method stub

            System.out.println("2222222");

        }
        @Override
        public void keyPressed(KeyEvent e) {
            // TODO Auto-generated method stub
            System.out.println("1111111");
        }
        @Override
        public void keyReleased(KeyEvent e) {
            // TODO Auto-generated method stub
            System.out.println("2333333333333");
        }


        @Override
        public void paint(Graphics g){
            for(int i = 0; i < 15; i++){
                for(int j = 0; j< 15;j++){
                    g.drawImage(mapimg[this.tempMap[j][i]], i*30, j*30, 30,30,this);
                }
            }
        }

    }

}

1 个答案:

答案 0 :(得分:-1)

由于您要将JPanelJButton添加到JFrameKeyListener只有在JPanel关注时才会生效。当您按下按钮时,JPanel会失去焦点(如果您从一开始就有多个组件,它就不会自动聚焦)。您应该将KeyListener添加到JFrame