`

探究 Z-Order

阅读更多

Z-order,也有人称为 Zorder,指的是对象之间的层次关系。举个简单的例子:在使用 PowERP oint 制作文件时,当你把文件上被其它对象盖住的某个对象「上推至最顶层」,你就是在改变它的 Z-order。通常 Z-order 高者置于 Z-order 低者的「上面」。

通常 GUI 程序设计都会用到 Z-order 的观念,所以 Borland OWL 有 Z-order,Java AWT 有 Z-order,Java Swing 也有 Z-order。这些 GUI 链接库都提供了良好的 Z-order 自动管理机制,贴心地帮我们管理 Z-order,大部分的情况之下,我们不会直接使用到 Z-order。但是,当你需要处理到对象之间的层次关系时,如果你不知道 Z-order,你可就麻烦了。我曾经用 Java 设计过一个简单的 UML 绘图软件,当时并未善加使用 Swing 的 Z-order 管理机制(即 JLayeredPane),结果多写了好些程序代码就只是为了控制层次关系。这篇文章简单地为您介绍 Java 的 Z-order 观念以及 JLayeredPane,希望你不要重蹈我的覆辙。

许多 Swing 的书都会再三告诫读者,「尽量不要」混合使用 Swing 和 AWT 的组件,原因就在于 Swing 和 AWT 的 Z-order 系统是不一样的。Swing 组件大都是 lightweight 的,而 AWT 的组件则一律是 heavyweight 的。我有个不错的比喻:Swing 组件是在 AWT 组件之内径自切割出来的层次,就好比 green thread 是在 process 之内径自切割出来的排程单位。你可能会问:「现在 green thread 已经「进化」成 native thread 了,以后 Swing 的 Z-order 会不会也「进化」成和 AWT 的 Z-order 同地位?」我认为不会,因为如果这样做的话,Swing 组件都必须继承自 AWT 组件,而目前 Swing 正致力于减少 CPU 和内存资源的消耗量来提升速度,所以不可能还走回头路 heavyweight 化。

AWT 和 Swing 的 Z-order 规则一样,如下:
1. 组件的 Z-order 一定比其容器来得高,组件一定位于容器上层。
2. 同一个容器的两个组件中,越早加入容器者其 Z-order 越高,位置越上层。

但是如果混合使用 AWT 和 Swing,上述第二条规则就不一定了。比方说,在某容器内先加入一个 Swing 的组件,再加入一个 AWT 的组件,且此二组件有重叠的区域,结果却是 AWT 组件出现在 Swing 组件上面。这并未遵守第二条的规定,因为此例同时使用了 AWT 和 Swing,Swing 组件被当成和容器同一个层,AWT 组件则是容器上一层。

在六个标准的 layout(包括 BorderLayout、FlowLayout、GridLayout、GridBagLayout、CardLayout、以及 BoxLayout)管理之下,容器的组件之间不会重叠(甚至连 CardLayout 管理之下也是如此,因为 CardLayout 只是逻辑上组件重叠,但实际上的做法是一次只有一个组件被设为 visible),所以大多数情况下 Z-order 并不会影响外观。但是当组件之间有重叠的情况发生时,你就要特别注意了,这些包括了:
˙ 将 layout 设为 null,由程序自行控制组件的 layout,而且允许组件重叠的话,你不可以同时使用 AWT 和 Swing 的组件。
˙ JInternalFrame、JScrollPane、JLayeredPane、JDesktopPane...... 等容器会以重叠的方式放置组件,你不可以同时使用 AWT 和 Swing 的组件。
˙ 当使用 pop-up menu 时,此 menu 的容器如果有 heavyweight 的组件,那么你必须让此 pop-up menu 为 heavyweight,否则此 pop-up menu 可能会被盖住。呼叫 JPopupMenu.setLightWeightPopupEnabled(false) 即可让以后产生的 pop-up menu 都是 heavyweight 形式的。

前面提到,越早加入某容器的组件,其 Z-order 越高。除了 remove 再 add 之外,想改变 Z-order,你别无它法。但是如果你真的需要改变某容器的组件之 Z-order,那么你可以改用 javax.swing.JLayeredPane 当作容器,因为 JLayeredPane 提供了许多让你可以改变组件 Z-order 的 method。

对于 JLayeredPane 来说,Z-order 由两部分组成,分别是 layer 和 position,两者都是整数值。某组件的 layer 数目越高,表示位于越上层。如果两个组件位于同一个 layer,则 position 数目越低者位于越上层。关于 JLayeredPane,请看 O'Reilly 出版的「Java Swing」一书 223~231 页。

这篇文章可能有点复杂,必要时请仔细地多阅读几次。

分享到:
评论

相关推荐

    窗口之间的主从关系及Z-Order.doc

    本篇文章将详细探讨窗口之间的主从关系,特别是层叠窗口、弹出窗口和子窗口的特性,以及Z-Order的概念。 首先,窗口类型分为三种:层叠窗口(Overlapped Window)、弹出窗口(Popup Window)和子窗口(Child Window...

    前端开源库-eslint-plugin-import-order

    `eslint-plugin-import-order` 是一个针对 `ESLint` 的开源插件,专门用于规范项目的 `import` 和 `require` 语句的顺序,确保代码的整洁和标准化。 `ESLint` 是一款强大的静态代码分析工具,它能帮助开发者检测并...

    Jsp-Order-online+javaweb 网上点餐项目

    Jsp-Order-online+javaweb 网上点餐项目Jsp-Order-online+javaweb 网上点餐项目Jsp-Order-online+javaweb 网上点餐项目Jsp-Order-online+javaweb 网上点餐项目Jsp-Order-online+javaweb 网上点餐项目Jsp-Order-on...

    higher-order networks.pdf

    《高阶网络:简复形的介绍》是网络理论领域的一部重要著作,它深入探讨了复杂系统中多体互动的网络结构。高阶网络这一概念不仅应用于神经科学中的大脑研究,也涵盖社会网络、合作网络等多个领域。...

    phaser-z-order-test:测试不同的方式来显示 2d 游戏的 z 顺序以获得有趣的结果

    在这个名为 "phaser-z-order-test" 的项目中,开发者显然在探索如何利用不同的 Z-Order 策略来创造出有趣的游戏视觉效果。 在 2D 游戏中,Z-Order 主要控制着游戏元素在垂直方向上的堆叠顺序,尽管屏幕是二维的,但...

    前端开源库-eslint-plugin-import-order-alphabetical

    `eslint-plugin-import-order-alphabetical` 是一个针对这个需求的开源库,它是一个`ESLint`插件,用于规范项目的导入顺序,确保所有导入语句按照字母顺序排列。这个插件可以帮助开发者自动检查和修复导入模块时的...

    MATLAB高阶谱工具箱-Higher-Order Spectral Analysis (HOSA) Toolbox.rar

    MATLAB高阶谱工具箱-Higher-Order Spectral Analysis Toolbox.rar MATLAB高阶谱工具箱 Matlab中文论坛: www.iLoveMatlab.cn

    PyPI 官网下载 | flake8-import-order-0.13.tar.gz

    **PyPI 官网下载 | flake8-import-order-0.13.tar.gz 知识点详解** 在Python编程环境中,规范的代码风格是保证代码可读性和团队协作效率的关键。`flake8-import-order`是一个Python库,它专门用于帮助开发者检查并...

    Python库 | df-and-order-0.1.0.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:df-and-order-0.1.0.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    Lag group consensus for the second-order nonlinear multi-agentsystems via adaptive control approach

    二阶非线性多智能体系统的自适应延迟群体一致性研究,郭万里,,本文研究了二阶非线性多智能体系统延迟群体一致性问题。整个多智能体系统被分成多个小的群体。对每个小群体,文中采用自适应控制�

    高阶谱书Higher-Order Spectral Analysis Toolbox

    高阶谱书Higher-Order Spectral Analysis Toolbox MATALB 高阶谱分析工具箱原版介绍

    stylelint-order, stylelint订单相关linting规则的插件包.zip

    stylelint-order, stylelint订单相关linting规则的插件包 stylelint顺序 stylelint 相关linting规则的插件包。 每个规则支持 autofixing ( stylelint --fix ) 。安装首先,安装 stylelint插件:npm in

    first-order-model-checkpoint-94.pth.tar + example mp4 + 配置文件yaml

    First Order Model (512x512 pixels)模型文件 —— https://github.com/adeptflax/motion-models 该模型使用rtx 3090 训练了5 天。2 个 GPU 似乎并没有太大地加快进程,它只有大约 50% - 60% 的 GPU 使用率。使用 ...

    Z-order 和集合拷贝

    1、SendToBack 和 BringToFront 方法是改变 Windows:registered: 窗体控件 z-order 的唯一选项吗?2、如何用 Windows 窗体控件集的 CopyTo 方法将控件拷贝到一个数组中? 关键字:advanced basics,windows,forms ...

    前端开源库-react-loading-order-with-animation

    "react-loading-order-with-animation"是一个专门针对React的开源库,旨在帮助开发者处理页面加载时的数据顺序和伴随的动画效果,提升用户体验。 在现代Web应用中,用户界面的加载速度和视觉反馈至关重要。当用户...

    first-order-model-checkpoint-94.pth.tar

    First Order Model (512x512 pixels)模型文件 —— https://github.com/adeptflax/motion-models

    higher-order-organization-matlab-master.zip

    代码以斯坦福大学官网上的铁线虫的神经元网络作为实验数据集对作者提出的复杂网络的高阶聚类进行仿真,代码可以直接在MATLAB平台上运行,实验结果表明用三个节点的motif作为基本单元,网络的性能更强,导度更小,也...

    java-leetcode-107-binary-tree-level-order-traversal

    java java_leetcode-107-binary-tree-level-order-traversal

Global site tag (gtag.js) - Google Analytics