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);
}
}
}
}
}
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. .. –
.. Um dies zu tun, wählen Sie den Text und klicken Sie auf die '{}' Taste am oberen Rand der Nachricht Buchung/Bearbeitungsformular. –
Tastenbelegungen, Tastenbelegungen, Tastenbelegungen - Jede Antwort, die die Verwendung nicht empfiehlt, ist einfach falsch – MadProgrammer