我正在写一个基于俄罗斯方块的游戏,我正在使用GridLayout来显示俄罗斯方块片落下的实际轴。 GridLayout充满了少量JLabel对象。轴本身就是另一个JPanel中的JPanel,我用来控制整个游戏的面板。当游戏结束时,我希望“GAME OVER”这个词出现在网格的顶部,可能还有一个小图像。
我的竖井是ShaftPanel的一个实例,它扩展了JPanel(这样我可以覆盖paintComponent)并且是一个嵌套的私有类(因此它可以访问较大JPanel的私有实例变量)。它需要访问的私有实例变量是布尔游戏,当游戏在会话中时为true,在游戏结束时设置为false。这是我的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);
}
}
我在较大的类中有一个方法在适当的时候调用shaft的repaint()方法。添加print语句表示在我需要时调用paintComponent方法,并且在正确的时间调用setColor,setFont,drawChars方法。然而,没有任何表现。我非常怀疑文本是在JLabel的网格下绘制的,因此无法看到,但我不知道如何解决这个问题。网格内的JLabel必须保持不透明,因为程序依赖于它们是不同的颜色。有没有办法告诉paintComponent在面板中的任何其他内容上绘制文本?
答案 0 :(得分:1)
我可能不会用这种方式制作俄罗斯方块,但测试这种方法的一种方法是删除“if(游戏)”并查看游戏结束是否正在写入,即使没有JLabel存在(除非它们总是存在有时候是空白的。)
无论如何,我认为可能有用的虽然我不认为我曾经使用它是GlassPanel ....这是一个可以叠加在你当前的JFrame etx上的面板......
在此查找更多代码和信息:http://www.java2s.com/Code/Java/Swing-JFC/Paintonglasspane.htm
答案 1 :(得分:1)
请参阅Using a Glass Pane上的Swing教程中的部分,以获取有关玻璃窗格如何工作的示例和说明。
另一个选择是使用JWindow显示带有消息和图标的标签。