gpt4 book ai didi

java - JLayeredPane:深度和位置之间的功能区别是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:18:04 25 4
gpt4 key购买 nike

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

这是我的理解:

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

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

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

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

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

 or 

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

我已经测试了这两种方法,但我找不到这两种方法之间的功能差异。

谁能为我解开这个谜团?

最佳答案

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

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

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

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

现在您可能会争辩说,既然您拥有“位置”值,您根本不需要多层,因为您可以简单地通过它们的“位置”值沿 z 轴定位所有组件。这是事实,没有人阻止您这样做。

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

  • DEFAULT_LAYER
  • 调色板图层
  • MODAL_LAYER
  • POPUP_LAYER
  • DRAG_LAYER

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

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

幸运的是,Swing 已经为您完成了所有这些工作(通过在内部使用 JLayeredPane 或其子类),因此您只需在 JDialog 上调用 setVisible(boolean) 或 setModal(boolean) ,它就会按照您期望的方式进行到。

关于java - JLayeredPane:深度和位置之间的功能区别是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4238666/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com