先别管我写的质量,但是其中的键盘监听没有效果,求解决,O(∩_∩)O谢谢!
import java.awt.Graphics;
import java.util.Date;
import javax.swing.*;public class MessageFrame extends JPanel{
Date time=new Date();
int x[]=new int[100];
int y[]=new int[100];
int count=1;
int lastX=0;
int lastY=0;
int action=1;
int sec;
int gameOn=1;
int pause=0;
public MessageFrame(){
sec=time.getSeconds();
x[0]=y[0]=0;
}
public void paintComponent(Graphics g){
super.paintComponent(g);
for(int i=0;i<count;++i){
g.drawString("█",x[i],y[i]+10);
}
}

}import java.awt.*;
import java.awt.event.*;import javax.swing.*;public class MainFrame extends JFrame implements ActionListener,KeyListener{
JMenuBar bar=new JMenuBar();
JMenu Game=new JMenu("Game");
JMenu Help=new JMenu("Help");
JMenu Speed=new JMenu("Speed");
JMenuItem NewGame=new JMenuItem("New Game");
JMenuItem Pause=new JMenuItem("Pause");
JMenuItem Continue=new JMenuItem("Continue");
JMenuItem Slow=new JMenuItem("Slow");
JMenuItem Middle=new JMenuItem("Middle");
JMenuItem Fast=new JMenuItem("Fast");
JLabel l1=new JLabel("状态");
JLabel l2=new JLabel("速度");
JLabel l3=new JLabel("分数");
JLabel info1=new JLabel();
JLabel info2=new JLabel();
JLabel info3=new JLabel();
JPanel p=new JPanel();
MessageFrame mf=new MessageFrame();
public MainFrame(){
setVisible(true);
setLayout(new BorderLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setJMenuBar(bar);
setBounds(200,200,377,462);
mf.setFocusable(true);

NewGame.setAccelerator(KeyStroke.getKeyStroke("ctrl N"));
Pause.setAccelerator(KeyStroke.getKeyStroke("ctrl P"));
Continue.setAccelerator(KeyStroke.getKeyStroke("ctrl C"));
p.setLayout(new FlowLayout());
bar.add(Game);bar.add(Help);bar.add(Speed);
Game.add(NewGame);Game.add(Pause);Game.add(Continue);
Speed.add(Slow);Speed.add(Middle);Speed.add(Fast);
p.add(l1);p.add(info1);p.add(l2);p.add(info2);p.add(l3);p.add(info3);
this.getContentPane().add(p,BorderLayout.EAST);
this.getContentPane().add(mf,BorderLayout.CENTER);
NewGame.addActionListener(this);
Pause.addActionListener(this);
Continue.addActionListener(this);
Slow.addActionListener(this);
Middle.addActionListener(this);
Fast.addActionListener(this);
mf.addKeyListener(this);
} public void actionPerformed(ActionEvent e) {
if(e.getSource()==NewGame){

}else
if(e.getSource()==Pause){
mf.pause=1;
}else
if(e.getSource()==Continue){
mf.pause=0;
}
} public void keyTyped(KeyEvent e) { } public void keyPressed(KeyEvent e) {
switch(e.getKeyCode())
{
case KeyEvent.VK_DOWN:mf.action=2;System.out.println("Yes");;break;
case KeyEvent.VK_UP:mf.action=4;System.out.println("Yes");break;
case KeyEvent.VK_LEFT:mf.action=3;System.out.println("Yes");break;
case KeyEvent.VK_RIGHT:mf.action=1;System.out.println("Yes");break;
default:;
}
} public void keyReleased(KeyEvent e) {}
}import java.util.Date;public class Snake{
MainFrame mainf=new MainFrame();
public Snake(){ }
public void gameRun(){
while(mainf.mf.gameOn==1){
while(mainf.mf.pause==1){if(mainf.mf.pause==0)break;};
if(new Date().getSeconds()!=mainf.mf.sec){
mainf.mf.sec=new Date().getSeconds();
for(int i=1;i<mainf.mf.count;++i){
mainf.mf.x[i]=mainf.mf.x[i-1];
mainf.mf.y[i]=mainf.mf.y[i-1];
}
if(mainf.mf.action==1){
mainf.mf.x[0]=mainf.mf.x[0]+10;
mainf.mf.y[0]=mainf.mf.y[0];
}else
if(mainf.mf.action==2){
mainf.mf.x[0]=mainf.mf.x[0];
mainf.mf.y[0]=mainf.mf.y[0]+10;
}else
if(mainf.mf.action==3){
mainf.mf.x[0]=mainf.mf.x[0]-10;
mainf.mf.y[0]=mainf.mf.y[0];
}else
if(mainf.mf.action==4){
mainf.mf.x[0]=mainf.mf.x[0];
mainf.mf.y[0]=mainf.mf.y[0]-10;
}
mainf.mf.repaint();
}
}
}
public static void main(String args[]){
Snake snake=new Snake();
snake.gameRun();
}
}先别管我写的质量,但是其中的键盘监听没有效果,求解决,O(∩_∩)O谢谢!

解决方案 »

  1.   

    呵呵 焦点问题
    Key 事件发生在当前焦点组件上
    你的那个 mf 是个 JPanel 
    JPanel 是不会主动获得焦点的,
    也不会通过鼠标点击获得焦点
    所以你的键盘事件一直没反应一种方法是,一直强制让 mf 获得焦点另一种方法是对整个 JFrame 的所有的键盘事件进行整体监听,用AWTListener改了个你的类你试试class MainFrame extends JFrame implements ActionListener, AWTEventListener {
    JMenuBar bar = new JMenuBar();
    JMenu Game = new JMenu("Game");
    JMenu Help = new JMenu("Help");
    JMenu Speed = new JMenu("Speed");
    JMenuItem NewGame = new JMenuItem("New Game");
    JMenuItem Pause = new JMenuItem("Pause");
    JMenuItem Continue = new JMenuItem("Continue");
    JMenuItem Slow = new JMenuItem("Slow");
    JMenuItem Middle = new JMenuItem("Middle");
    JMenuItem Fast = new JMenuItem("Fast");
    JLabel l1 = new JLabel("状态");
    JLabel l2 = new JLabel("速度");
    JLabel l3 = new JLabel("分数");
    JLabel info1 = new JLabel();
    JLabel info2 = new JLabel();
    JLabel info3 = new JLabel();
    JPanel p = new JPanel();
    MessageFrame mf = new MessageFrame(); public MainFrame() {
    setVisible(true);
    setLayout(new BorderLayout());
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setJMenuBar(bar);
    setBounds(200, 200, 377, 462);
    mf.setFocusable(true); NewGame.setAccelerator(KeyStroke.getKeyStroke("ctrl N"));
    Pause.setAccelerator(KeyStroke.getKeyStroke("ctrl P"));
    Continue.setAccelerator(KeyStroke.getKeyStroke("ctrl C"));
    p.setLayout(new FlowLayout());
    bar.add(Game);
    bar.add(Help);
    bar.add(Speed);
    Game.add(NewGame);
    Game.add(Pause);
    Game.add(Continue);
    Speed.add(Slow);
    Speed.add(Middle);
    Speed.add(Fast);
    p.add(l1);
    p.add(info1);
    p.add(l2);
    p.add(info2);
    p.add(l3);
    p.add(info3);
    this.getContentPane().add(p, BorderLayout.EAST);
    this.getContentPane().add(mf, BorderLayout.CENTER);
    NewGame.addActionListener(this);
    Pause.addActionListener(this);
    Continue.addActionListener(this);
    Slow.addActionListener(this);
    Middle.addActionListener(this);
    Fast.addActionListener(this);
    mf.getToolkit().addAWTEventListener(this, AWTEvent.KEY_EVENT_MASK);
    } @Override
    public void actionPerformed(ActionEvent e) {
    if (e.getSource() == NewGame) { } else if (e.getSource() == Pause) {
    mf.pause = 1;
    } else if (e.getSource() == Continue) {
    mf.pause = 0;
    }
    } @Override
    public void eventDispatched(AWTEvent event) {
    if (event.getID() == KeyEvent.KEY_PRESSED) {
    KeyEvent e = (KeyEvent) event;
    switch (e.getKeyCode()) {
    case KeyEvent.VK_DOWN:
    mf.action = 2;
    System.out.println("Yes");
    break;
    case KeyEvent.VK_UP:
    mf.action = 4;
    System.out.println("Yes");
    break;
    case KeyEvent.VK_LEFT:
    mf.action = 3;
    System.out.println("Yes");
    break;
    case KeyEvent.VK_RIGHT:
    mf.action = 1;
    System.out.println("Yes");
    break;
    default:
    break;
    }
    }
    }
    }