小弟最近正在写一个俄罗斯方块的程序,用的JApplet的架构。其中那个MainPanel用来显示方块和监听键盘事件。但是键盘监听怎么都实现不了。本来以为是焦点的问题,结果还是不行。求高手帮忙。
我的程序主类是继承了JApplet的类MyEros。下面这个类是我声明在其中的内部类。我在初始化这个内部类的时候已经调用了requestFocusInWindow()的方法,但还是不行。requestFocus我也用过了,也不行。public class MainPanel extends JPanel implements KeyListener{

private static final long serialVersionUID = 0;
private Image bgImage;
private Graphics bg; 

public MainPanel() {
setBackground(Color.LIGHT_GRAY);
setFocusable(true);
addKeyListener(this);
}

public void paintComponent(Graphics g) {
//Draw grid first
drawGrid(g);
drawShape(g);
}

//use buffer to avoid twinkling
public void update (Graphics g)
{
// 初始化buffer
if (bgImage == null)
{
bgImage = createImage (this.getSize().width, this.getSize().height);
bg = bgImage.getGraphics ();
} // 后台清屏,即设置圆球组件和后台一样的颜色,大小
bg.setColor (getBackground ());
bg.fillRect (0, 0, this.getSize().width, this.getSize().height); // 绘制相应的元素组件
bg.setColor (getForeground());
paint(bg); // 在屏幕上重画已经绘制好的圆
g.drawImage (bgImage, 0, 0, this);


private void drawShape(Graphics g) {
// TODO Auto-generated method stub
g.setColor( Color.BLACK );
for ( int i=0; i<Y_GRID_NUM; i++ ) {
for ( int j=0; j<X_GRID_NUM; j++ ) {
if ( grid[i][j] == 1 ) {
g.fillRect(j*GRID_SIZE+1, i*GRID_SIZE+1, GRID_SIZE-1, GRID_SIZE-1);
}
}
}
} private void drawGrid(Graphics g) {
g.setColor(Color.WHITE);
for ( int i=0; i<X_GRID_NUM+1; i++ ) {
g.drawLine( i*GRID_SIZE, 0, i*GRID_SIZE, GRID_SIZE*Y_GRID_NUM );
}

for ( int i=0; i<Y_GRID_NUM+1; i++ ) {
g.drawLine(0, i*GRID_SIZE, GRID_SIZE*X_GRID_NUM, i*GRID_SIZE);
}
} @Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
switch (e.getID()) {
case KeyEvent.VK_LEFT:
{
fallingShape.moveLeft(grid);
}
case KeyEvent.VK_RIGHT:
{
fallingShape.moveRight(grid);
}
}
repaint();
} @Override
public void keyPressed(KeyEvent e) {
// TODO Auto-generated method stub

} @Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub

}
}