我正在为学校Java项目开发Connect Four游戏。我已经得到了JLayeredPane的'how',它正如预期的那样工作,但我并没有完全理解某个概念背后的'为什么'。
以下是我的理解:
JLayeredPane是一个类似于JPanel的容器,允许您为每个组件指定深度和位置。深度是一个整数,0表示底层,n-1表示顶层,n表示组件数。 Position是一个int(是的,一个使用整数包装类,一个只是一个原语!),它指定了一个组件在层中的位置,0是最顶层,-1是最底层,正是ints in之间,数字越低,位置越高。因此,单层中的四个组件可以从最顶部到最底部排序到位置0,1,2,-1。
我的问题是,有两个概念需要什么?
例如,我创建了三个带图像的JLabel:frontBoard,backBoard和piece。这件作品有时会在frontBoard前面,有时会在frontBoard和backBoard之间。让我们来看看第二个例子。
我可以通过以下任何一种方式获得相同的效果:
1)我可以将backBoard设置为0层,位置0;片断到第1层,位置0;和frontBoard到第2层,位置0
or
2)我可以将backBoard设置为0层,位置-1;片断到0层,位置1;和frontBoard到0层,位置0
我已经测试了这两种方法,但我找不到两种方法之间的功能差异。
任何人都可以为我揭开这个谜团吗?
答案 0 :(得分:1)
首先,在这种情况下最好的办法是查看教程,它们通常非常有用:http://download.oracle.com/javase/tutorial/uiswing/components/layeredpane.html
此外,该类的javadoc本身对JLayeredPane的工作方式有很好的解释。
由于您已经实现了项目,因此您知道可以通过两种不同的方式实现组件堆叠:将每个组件放在自己的层上,或者通过分配位于同一层上不同位置值的不同组件。效果相同,但您可以使用两种不同的属性来实现它:
n
个组件且您从0开始计数,则位置必须是介于0和n-1
之间的值。现在你可以争辩说,由于你有“位置”值,你根本不需要多个层,因为你可以简单地通过它们的“位置”值沿z轴定位所有组件。这是事实,没有人阻止你这样做。
当您意识到有一个预定义的常量用于图层的“深度”值时,可以看到多层的基本原理:
这些只是复杂多窗口应用程序的逻辑分组,可帮助您确保满足某些堆叠约束:假设您要创建一个出现在主应用程序框架顶部的模式对话框窗口。如果使用单个图层,则必须自己跟踪所有可见组件的位置,并将对话框的位置设置为n。现在添加拖放动画,弹出菜单等等,这项任务变得非常复杂。
通过使用预定义的层,这种复杂性降低了。如果你想显示一个模态对话框窗口,你不关心主应用程序窗口的组件,只需将它放在MODAL_LAYER上就可以了:你可以确定它显示在所有其他组件之上
幸运的是,Swing已经为你做了所有这些事情(通过在内部使用JLayeredPane或其子类),所以你可以在JDialog上调用setVisible(boolean)或setModal(boolean),它会以你期望的方式运行到。