我正在编写一个基于俄罗斯方块的游戏,并且我正在使用 GridLayout 来显示俄罗斯方块碎片掉落的实际轴。GridLayout 充满了小的 JLabel 对象。轴本身就是另一个 JPanel 中的 JPanel,我用来包含和控制整个游戏的面板。游戏结束时,我希望“GAME OVER”字样出现在网格顶部,可能伴随着一个小图像。
我的轴是 ShaftPanel 的一个实例,它扩展了 JPanel(以便我可以覆盖paintComponent)并且是一个嵌套的私有类(因此它可以访问更大的 JPanel 的私有实例变量)。它需要访问的私有实例变量是布尔游戏,当游戏在会话中时为真,当游戏结束时设置为假。这是我的 ShaftPanel 类的代码:
public class ShaftPanel extends JPanel {
public ShaftPanel(GridLayout g){
super(g);
}
public void paintComponent(Graphics g){
super.paintComponent(g);
if(game)
return;
g.setColor(Color.WHITE);
g.setFont(new Font("Courier New", Font.BOLD, 15));
char[] c = {'G','A','M','E',' ','O','V','E','R'};
g.drawChars(c,0,c.length,45,45);
}
}
我在较大的类中有一种方法在适当的时候调用轴的 repaint() 方法。添加打印语句表明paintComponent 方法在我想要的时候被调用,并且setColor、setFont、drawChars 方法都在正确的时间被调用。然而,什么也没有出现。我高度怀疑文本是在 JLabels 的网格下方绘制的,因此看不到,但我不知道如何解决这个问题。网格内的 JLabel 必须保持不透明,因为程序依赖于它们是不同的颜色。有没有办法告诉paintComponent 在面板中的任何其他内容之上绘制文本?