2011-05-16 100 views
1

我正在编写基于俄罗斯方块的游戏,并且我使用GridLayout来显示Tetris碎片掉落的实际轴。 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); 
} 

}

我已经在较大的类调用在适当的时候轴的重绘()方法中的一种方法。添加一个print语句表明paintComponent方法在我想要的时候被调用,并且setColor,setFont,drawChars方法都在正确的时间被调用。但是,什么也没有显示我高度怀疑文本正在JLabels的网格下方绘制,因此无法看到,但我不知道如何解决此问题。网格内的JLabel必须保持不透明,因为程序依赖于它们的不同颜色。有没有办法告诉paintComponent在面板上的其他任何东西上绘制文本?

回答

1

关于如何玻璃板的作品为例,解释见从Swing教程中的部分上Using a Glass Pane

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

1

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

无论如何,我认为可能有用,虽然我不认为我曾经使用它是一个GlassPanel ....这是一个面板,可以覆盖在您当前的JFrame etx ...

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