我用java编写一个小程序(俄罗斯方块),程序要求界面响应键盘上下左右键,freme.addKeyListener后,如果只添加gamePanel程序就能正确响应键盘上下左右键,但是如果添加了信息面板MessagePa...
我用java编写一个小程序(俄罗斯方块),程序要求界面响应键盘上下左右键,freme.addKeyListener后, 如果只添加gamePanel 程序就能正确响应键盘上下左右键,但是如果添加了信息面板MessagePanel后就不能响应了.
求解决办法.
为了减少代码量,写了个测试代码. 要求修改下面代码,使frame添加了MessagePanel后仍然能响应上下键.
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
import java.util.*;
import javax.swing.Timer;
public class KeyListener
{
public static void main(String[] agrs)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
TetrisFrame frame = new TetrisFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}
class TetrisFrame extends JFrame
{
public TetrisFrame()
{
setSize(450, 540);
addKeyListener(new MyKeyListener());
add(gameComponent, BorderLayout.CENTER);
/*问题就出在这里,如果添加了MessgePanel程序就无法响应键盘事件(上下键)了,如果不添加它,就能响应*/
add(new MessagePanel(), BorderLayout.EAST);
}
private GameComponent gameComponent = new GameComponent();
private class MyKeyListener extends KeyAdapter
{
public void keyPressed(KeyEvent e)
{
int keyCode = e.getKeyCode();
if(keyCode == KeyEvent.VK_UP || keyCode == KeyEvent.VK_KP_UP)
{
gameComponent.setColor(Color.BLACK);
gameComponent.repaint();
}
else if(keyCode == KeyEvent.VK_DOWN || keyCode == KeyEvent.VK_KP_DOWN)
{
gameComponent.setColor(Color.RED);
gameComponent.repaint();
}
}
}
}
class GameComponent extends JPanel
{
public GameComponent()
{
color = Color.RED;
}
public void setColor(Color c)
{
color = c;
}
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
int size = 25;
g2.setPaint(color);
g2.fill(new Rectangle.Double(0, 0, size * 10 , size * 20));
}
private Color color;
}
class MessagePanel extends JPanel
{
public MessagePanel()
{
setLayout(new GridLayout(8, 1));
for(int i = 0; i < 8; i++)
add(new JButton("没用的按钮"));
}
}
展开