【问题标题】:JLayeredPane: what's the functional difference between depth and position?JLayeredPane:深度和位置之间的功能区别是什么?
【发布时间】:2011-05-13 10:13:24
【问题描述】:

我正在为一个学校 Java 项目开发四人连接游戏。我了解了 JLayeredPane 的“如何”,它按预期工作,但我不太了解某个概念背后的“原因”。

这是我的理解:

JLayeredPane 是一个容器,类似于 JPanel,它允许您为每个组件指定深度和位置。 Depth 是一个整数,0 是底层,n-1 是顶层,n 是组件的数量。 Position 是一个 int(是的,一个使用 Integer 包装类,一个只是一个基元!)指定组件在层内的位置,0 是最顶层,-1 是最底层,正整数 in之间,数字越小位置越高。因此,单个层中的四个组件可以从最上到最下排序到位置 0、1、2、-1。

我的问题是,有什么必要同时拥有这两个概念?

例如,我创建了三个带有图像的 JLabel:前板、后板和一块。棋子有时在frontBoard前面,有时在frontBoard和backBoard之间。让我们来看看第二个例子。

我可以通过以下任何一种方式获得相同的效果:

1) 我可以将背板设置为第 0 层,位置 0;该片到第 1 层,位置 0;和 frontBoard 到第 2 层,位置 0

 or 

2) 我可以将背板设置为第 0 层,位置 -1;该片到第 0 层,位置 1;和 frontBoard 到第 0 层,位置 0

这两种方法我都测试过了,我找不到这两种方法在功能上的区别。

谁能帮我解开这个谜团?

【问题讨论】:

    标签: java swing jlayeredpane


    【解决方案1】:

    首先,在这种情况下最好的办法是看一下教程,它们通常信息量很大:http://download.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

    此外,该类本身的 javadoc 包含对 JLayeredPane 工作方式的很好解释。

    由于您已经实现了项目,因此您知道可以通过两种不同的方式实现组件的堆叠:将每个组件放在自己的层上,或者通过为同一层上的不同组件分配不同的位置值。效果是一样的,但是你会使用两个不同的属性来实现它:

    • "depth"layer 的一个属性:它们被枚举,因此深度为 0 的层是最远的最低层。深度较高的图层会覆盖深度较低的图层。
    • 由于层可以包含多个组件,并且组件总是可以重叠,因此必须有一种方法来定义层组件的 z 顺序:这是通过枚举组件来实现的带有 “位置” 值。如果层中有 n 组件,并且您从 0 开始计数,则位置必须是介于 0 和 n-1 之间的值。

    现在您可以争辩说,由于您有“位置”值,因此根本不需要多层,因为您可以通过它们的“位置”值沿 z 轴定位所有组件。这是真的,没有人阻止你这样做。

    当您意识到有一个预定义的常量可用于层的“深度”值时,可以看出多层的基本原理:

    • DEFAULT_LAYER
    • PALETTE_LAYER
    • MODAL_LAYER
    • POPUP_LAYER
    • DRAG_LAYER

    这些只是复杂多窗口应用程序的逻辑分组,可帮助您确保满足某些堆叠约束:假设您想要创建一个显示在主应用程序框架顶部的模式对话框窗口。如果使用单层,则必须自己跟踪所有可见组件的位置,并将对话框的位置设置为 n。现在添加拖放动画、弹出菜单等,这个任务变得相当复杂。

    通过使用预定义的层,这种复杂性降低了。如果你想显示一个模态对话框窗口,你不需要关心主应用程序窗口的组件,你只需将它放在 MODAL_LAYER 上就可以了:你可以确定它显示在所有其他组件之上.

    幸运的是,Swing 已经为您完成了所有这些工作(通过在内部使用 JLayeredPane 或其子类),因此您可以在 JDialog 上调用 setVisible(boolean) 或 setModal(boolean) ,结果会如您所愿到。

    【讨论】:

    • 易于使用预定义常量无疑是一个优势。我希望在这两种方法之间找到一些实际的功能差异,但我相信你是正确的,没有。我要指出的是,您对“位置”的描述并没有提到最底部的位置是-1,最顶部的位置是 0,两者之间的有效值是 n-2,而不是 n-1。感谢您的回答!
    猜你喜欢
    • 1970-01-01
    • 2012-11-15
    • 2014-07-07
    • 2014-10-29
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    相关资源
    最近更新 更多