2017-05-13 4 views
0

Wenn ich setButton() lösche und die Tasten drücke, gibt es richtige Reaktionen, aber wenn ich setButton() hinzufüge, funktioniert nur die Taste, es gibt keine Reaktion auf das Drücken von Tasten, was passiert hier?Warum funktioniert mein KeyListener nicht, nachdem dem Rahmen Schaltflächen hinzugefügt wurden?

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) Häufige Probleme bei der Verwendung von 'KeyListener' resultieren aus a) die Komponente ist nicht fokussierbar b) die Komponente hat keinen Fokus. 2) Für Swing verwenden wir typischerweise [key bindings] (https://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html) und nicht die untere Ebene 'KeyListener'. 3) Sie sollten diese Dinge wirklich testen, bevor Sie 250 Zeilen Code bekommen! 4) Für eine bessere Hilfe sollten Sie ein [MCVE] oder [Short, Self Contained, Correct Example] (http://www.sscce.org/) veröffentlichen. 5) Bitte verwenden Sie Code-Formatierung für Code und Code, strukturierte Dokumente wie HTML/XML oder Eingabe/Ausgabe. .. –

+0

.. Um dies zu tun, wählen Sie den Text und klicken Sie auf die '{}' Taste am oberen Rand der Nachricht Buchung/Bearbeitungsformular. –

+0

Tastenbelegungen, Tastenbelegungen, Tastenbelegungen - Jede Antwort, die die Verwendung nicht empfiehlt, ist einfach falsch – MadProgrammer

Antwort

-1

Da Sie hinzufügen JPanel und JButton zu einem JFrame, wird die KeyListener nur dann aktiv sein, wenn die JPanel fokussiert ist. Die JPanel wird unscharf, wenn Sie eine Taste drücken (und wenn Sie mehrere Komponenten von Anfang an haben, wird es nicht automatisch fokussiert). Sie sollten stattdessen eine KeyListener an die JFrame hinzufügen.

+0

Wie fügt man den 'KeyListener' zu dem Rahmen hinzu, der das Problem löst, wenn die Taste den Tastaturfokus greift. Sie haben das Problem einfach von einem Ort zum anderen verschoben, ohne es tatsächlich zu lösen. – MadProgrammer

+0

Da der JFrame die JButtons enthält, wird der JFrame fokussiert, wenn die JButtons fokussiert sind. Ein JFrame wird immer fokussiert sein, solange eine seiner Komponenten fokussiert ist. Grundsätzlich bleibt der JFrame immer fokussiert, solange sich der Benutzer in diesem Fenster befindet. Wenn du der jenige bist, der mich ablehnt, kannst du bitte Dinge nicht ablehnen, die du nicht versucht hast ... @MadProgrammer –

+0

Aber der Knopf bekommt den Tastaturfokus, nicht den Rahmen - so funktionieren KeyListeners nicht – MadProgrammer

Verwandte Themen