2017-05-13 12 views
0

setButton()を削除してキーを押すと正しい反応がありますが、setButton()を追加すると、ボタンのみが機能し、キーを押しても反応はありません。どうなりますか?フレームにボタンを追加した後に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を追加しているのでJPanelがフォーカスされたときに、KeyListenerにのみアクティブになります。 JPanelは、ボタンを押してもピントが合いません(最初から複数のコンポーネントがある場合は、自動的にピントが合いません)。代わりにJFrameKeyListenerを追加する必要があります。

+0

ボタンがフォーカスを取得したときに問題を解決するためにフレームに 'KeyListener'を追加する方法。問題をある場所から別の場所に実際に解決せずに移動しました – MadProgrammer

+0

JFrameにJButtonが含まれるようになると、JButtonにフォーカスが当てられたときにJFrameがフォーカスされます。 JFrameは、そのコンポーネントのいずれかがフォーカスされている限り、常にフォーカスされます。基本的には、ユーザーがそのウィンドウにいる限り、JFrameは常にフォーカスされます。あなたが私にdownvotingしている場合は、あなたが試してhaventものをdownvoteしないでください... @MadProgrammer –

+0

しかし、ボタンは、キーボードのフォーカスではなく、フレームを取得 - それはKeyListenersの仕組みではない – MadProgrammer

関連する問題