JAVA键盘监听无效

JAVA编程中键盘监听突然失效
我正在写一个迷宫小游戏,整体的移动和地图都已经写完了,并且确认可以运行可以游玩,而且此时键盘依然可以被监听,但是我觉得JFrame窗体内的字体不好看,而且没有居中,所以我加了JPanel以及Font等语句,此时我并没有测试代码能否运行,而是又直接加了另一个可以清除eclipse控制台的类,再在类中用Robot实现了清屏代码后,在游戏类中调用了清屏代码,然后启动代码发现键盘不被监听了,于是我把之前加入的代码全部删去,但键盘依然无法被监听

这里是控制台清屏类

import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

class clearer
{
    public void clear() throws AWTException
    {
        Robot r=new Robot();
        r.mousePress(InputEvent.BUTTON3_MASK);
        r.mouseRelease(InputEvent.BUTTON3_MASK);
        r.keyPress(KeyEvent.VK_CONTROL);
        r.keyPress(KeyEvent.VK_R);
        r.keyRelease(KeyEvent.VK_R);
        r.keyRelease(KeyEvent.VK_CONTROL);
        r.delay(100);
    }
}

这里是游戏类(JPanel等语句已经被我删掉了)

class GameWindow extends JFrame implements KeyListener
{
    public char[][] gamemap = 
        { 
                {'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'},
                {'#','O','#','X','#',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
                {'#',' ','#',' ','#',' ','#','#','#','#','#','#','#',' ','#','#','#','#','#','#','#'},
                {'#',' ','#',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ','#',' ',' ',' ',' ',' ','#'},
                {'#',' ','#','#','#','#','#',' ','#',' ','#','#','#','#','#',' ','#','#','#',' ','#'},
                {'#',' ','#',' ',' ',' ',' ',' ','#',' ','#',' ',' ',' ',' ',' ','#',' ','#',' ','#'},
                {'#',' ','#',' ','#','#','#','#','#',' ','#',' ','#','#','#','#','#',' ','#',' ','#'},
                {'#',' ','#',' ','#',' ',' ',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ','#',' ','#'},
                {'#',' ','#',' ','#','#','#','#','#','#','#',' ','#','#','#','#','#','#','#',' ','#'},
                {'#',' ','#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ','#'},
                {'#',' ','#',' ','#','#','#','#','#','#','#','#','#',' ','#','#','#','#','#','#','#'},
                {'#',' ','#',' ','#',' ',' ',' ','#',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ','#'},
                {'#',' ','#',' ','#','#','#',' ','#',' ','#',' ','#','#','#','#','#','#','#',' ','#'},
                {'#',' ','#',' ',' ',' ',' ',' ','#',' ','#',' ','#',' ',' ',' ',' ',' ',' ',' ','#'},
                {'#',' ','#','#','#','#','#','#','#',' ','#',' ','#',' ','#','#','#','#','#',' ','#'},
                {'#',' ','#',' ',' ',' ',' ',' ',' ',' ','#',' ','#',' ','#',' ',' ',' ','#',' ','#'},
                {'#',' ','#',' ','#','#','#','#','#','#','#',' ','#',' ','#',' ','#',' ','#',' ','#'},
                {'#',' ','#',' ','#',' ',' ',' ',' ',' ','#',' ','#',' ','#',' ','#',' ','#',' ','#'},
                {'#',' ','#',' ','#',' ','#','#','#','#','#',' ','#',' ','#',' ','#','#','#',' ','#'},
                {'#',' ',' ',' ','#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#',' ',' ',' ',' ',' ','#'},
                {'#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#','#'} 
        };
    int x,y,p,q;
    char[][] reset=gamemap;
    int rx,ry;
    clearer c;
    public GameWindow()
    {
        JLabel tips=new JLabel("game is running");
        JLabel kd=new JLabel("Key Description:");
        JLabel up=new JLabel("w = ↑");
        JLabel down=new JLabel("s = ↓");
        JLabel left=new JLabel("a = ←");
        JLabel right=new JLabel("d = →");
        JLabel restart=new JLabel("r = restart");
        
        setSize(300,300);
        setTitle("game");
        setAlwaysOnTop(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new GridLayout(7,1));

        add(tips);
        add(kd);
        add(up);
        add(down);
        add(left);
        add(right);
        add(restart);
        
        x=1;y=1;p=1;q=3;rx=x;ry=y;
        for(int i=0;i<21;i++)
        {
            System.out.println(gamemap[i]);
        }
        addKeyListener(this);
        setVisible(true);
    }
    
    public void keyTyped(KeyEvent e)
    {
        char key=e.getKeyChar();
        if((key=='w'||key=='W')&&gamemap[x-1][y]!='#')
        {
            char temp=gamemap[x][y];
            gamemap[x][y]=gamemap[x-1][y];
            gamemap[x-1][y]=temp;
            x--;
            for(int i=0;i<21;i++)
            {
                System.out.println(gamemap[i]);
            }
        }
        if((key=='a'||key=='A')&&gamemap[x][y-1]!='#')
        {
            char temp=gamemap[x][y];
            gamemap[x][y]=gamemap[x][y-1];
            gamemap[x][y-1]=temp;
            y--;
            for(int i=0;i<21;i++)
            {
                System.out.println(gamemap[i]);
            }
        }
        if((key=='s'||key=='S')&&gamemap[x+1][y]!='#')
        {
            char temp=gamemap[x][y];
            gamemap[x][y]=gamemap[x+1][y];
            gamemap[x+1][y]=temp;
            x++;
            for(int i=0;i<21;i++)
            {
                System.out.println(gamemap[i]);
            }
        }
        if((key=='d'||key=='D')&&gamemap[x][y+1]!='#')
        {
            char temp=gamemap[x][y];
            gamemap[x][y]=gamemap[x][y+1];
            gamemap[x][y+1]=temp;
            y++;
            for(int i=0;i<21;i++)
            {
                System.out.println(gamemap[i]);
            }
        }
        if(key=='r'||key=='R')
        {
            gamemap=reset;
            x=rx;y=ry;
            for(int i=0;i<21;i++)
            {
                System.out.println(gamemap[i]);
            }
        }
        if(x==p&&y==q)
        {
            System.out.println("=========================");
            System.out.println("    CONGRATULATIONS!");
            System.out.println("        YOU   WIN!");
            System.out.println("=========================");
            dispose();
        }
    }
        
    public void keyReleased(KeyEvent e){}
    public void keyPressed(KeyEvent e){}
}

这里是主类

public  class  a12
 { 
     public static void main(String args[])
     {
        new GameWindow();
     }
 } 

这里是运行后键盘不被监听的截图

img

厉害了 还能自问自答,向你学习,给我个采纳吧 哈哈。

我就是提问者本人,在我查找相同问题的时候我看到了一个需要再窗口界面为焦点的时候按键盘,由于我代码是输出在控制台的,所以我点了控制台一下,在控制台直接输入,所以导致键盘不监听,,,,,正确的操作应该是点击运行后保证窗体是焦点,也就是点一下窗体再敲键盘,这时控制台就有内容输出了,T-T