1

我正在编写一个基于俄罗斯方块的游戏,并且我正在使用 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 在面板中的任何其他内容之上绘制文本?

4

2 回答 2

1

我可能不会以这种方式制作俄罗斯方块,但测试这一点的一种方法是删除“if(game)”并查看是否正在编写游戏结束,即使没有 JLabel 存在(除非它们总是在那里,有时是空白的)。

无论如何,我认为可能有用的是 GlassPanel,尽管我认为我从未使用过它……这是一个可以覆盖在您当前的 JFrame etx 上的面板……

在这里查看更多代码和信息:http ://www.java2s.com/Code/Java/Swing-JFC/Paintonglasspane.htm

于 2011-05-16T00:41:41.670 回答
1

请参阅 Swing 教程中有关使用玻璃窗格的部分,以获取有关玻璃窗格如何工作的示例和说明。

另一种选择是使用 JWindow 显示带有消息和图标的标签。

于 2011-05-16T03:19:47.340 回答