2017-05-13 26 views
0

setButton()을 삭제하고 키를 누르면 올바르게 반응하지만, setButton()을 추가하면 버튼 만 작동하고 키를 누르는 반응은 없습니다. 어떻게됩니까? JPanel에 초점이 맞춰지면프레임에 버튼을 추가 한 후 KeyListener가 작동하지 않는 이유는 무엇입니까?

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

    } 

} 
+2

1) 'KeyListener'사용과 관련된 일반적인 문제는 a) 구성 요소에 포커스가 없습니다. b) 구성 요소에 포커스가 없습니다. 2) Swing의 경우 일반적으로 하위 수준 인 KeyListener보다는 [key bindings] (https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html)를 사용합니다. 3) 코드 250 줄에 도달하기 전에 이러한 것들을 테스트해야합니다! 4) 더 빨리 도움을 받으려면 [MCVE] 또는 [단락, 자기 포함, 올바른 예] (http://www.sscce.org/)를 게시하십시오. 5) 코드 및 코드, HTML/XML 또는 입출력과 같은 구조화 된 문서의 경우 코드 형식을 사용하십시오. .. –

+0

.. 이렇게하려면 텍스트를 선택하고 메시지 게시/편집 양식 상단의 '{}'버튼을 클릭하십시오. –

+0

키 바인딩, 키 바인딩, 키 바인딩 - 사용을 권장하지 않는 답변은 모두 잘못되었습니다. – MadProgrammer

답변

-1

당신이 JFrameJPanelJButton을 추가되기 때문에, KeyListener에만 활성화됩니다. 버튼을 누를 때 JPanel에 초점이 맞지 않습니다. 처음부터 여러 개의 구성 요소가있는 경우 자동으로 초점이 맞춰지지 않습니다. 대신 에 KeyListener을 추가해야합니다.

+0

버튼이 키보드 포커스를 잡을 때 문제를 해결할 프레임에 'KeyListener'를 추가하는 방법은 무엇입니까? 실제로 문제를 해결하지 않고 한 위치에서 다른 위치로 문제를 옮겼습니다. – MadProgrammer

+0

JFrame에 JButton이 포함되게되면 JButton에 포커스가있을 때 JFrame이 초점을 맞 춥니 다. JFrame은 구성 요소 중 하나에 포커스가있는 경우 항상 초점을 맞 춥니 다. 기본적으로 JFrame은 사용자가 해당 창에있는 한 항상 초점을 맞 춥니 다. 만약 당신이 나를 downvoting 하나, 당신이 시도 havent 것들을 downvote하지 말아주세요 ... @MadProgrammer –

+0

하지만 버튼은 키보드 포커스를 프레임이 아니라, - KeyListeners 작동 방식이 아니에요 – MadProgrammer