P17 JLayeredPane层级面板

  • 1.概述
  • 2. 代码实例
  • 3.效果演示


系统:Win10
Java:1.8.0_333
IDEA:2020.3.4

1.概述

JLayeredPane:层级面板,JLayeredPane为容器添加了深度,允许组件在需要时互相重叠。Integer 对象指定容器中每个组件的深度,其中编号较高的组件位于其他组件之上。

为方便起见,JLayeredPane 将该深度范围分成几个不同的层。将组件放入相应的层,这样更容易确保组件正确地重叠,而不必担心为具体的深度指定编号:

AutomationElement 层级 plater层级_JLayeredPane

DEFAULT_LAYER:大多数组件位于的标准层。这是最底层。
PALETTE_LAYER:调色板层位于默认层之上。它们对于浮动工具栏和调色板很有用,因此可以位于其他组件之上。
MODAL_LAYER:该层用于模式对话框。它们将出现在容器中所有工具栏、调色板或标准组件的上面。
POPUP_LAYER:弹出层显示在对话框的上面。这样,与组合框、工具提示和其他帮助文本关联的弹出式窗口将出现在组件、调色板或生成它们的对话框之上。
DRAG_LAYER:拖动一个组件时,将该组件重分配到拖动层可确保将其定位在容器中的其他所有组件之上。完成拖动后,可将该组件重分配到其正常层。

JLayeredPane将深度范围按 层 划分,在同一层内又对组件按位置进一步划分,将组件放入容器时需要指定组件所在的层,以及组件在该层内的 位置(position/index)
层的编号越大越显示在前面;同层内位置编号越大越靠近底部(位置编号取值范围: [-1, n - 1],n 表示层内组件数量,其中 -1 表示最底,0 表示最顶)
通过 setLayer(Component c, int layer) 可设置组件所在的层数。
可以使用 JLayeredPane 的方法 moveToFront(Component)、moveToBack(Component) 和 setPosition 在组件所在层中对其进行重定位。还可以使用 setLayer 方法更改该组件的当前层和 setPosition(int) 调整层内的位置。

提示: 添加到 JLayeredPane 内的组件需要明确指定组在位置和宽高,否则不显示(类似绝对布局)

JLayeredPane 构造方法:

// 创建一个层及面部
JLayeredPane()

JLayeredPane 常用方法:

/**
 * 添加组件到指定的层(默认放到层内最底部),参数说明:
 *     comp: 待添加的组件
 *     layer: 所在的层, 层数是int类型, 由于该方法与另一个 add(Component, int) 方法类似, 直接使用会有冲突, 所以使
 *            用该方法传递 layer 参数时, 必须使用 Integer 类型来明确调用的是下面 add(Component, Object) 方法。
 */
void add(Component comp, Object layer)

// 添加组件到指定的层和层内的位置
void add(Component comp, Object layer, int position)

// 设置组件所在层(默认放到层内最底部)
void setLayer(Component c, int layer)

// 设置组件所在层,以及在层内的位置
void setLayer(Component c, int layer, int position)

// 移动组件到其所在层的最顶部位置
void moveToFront(Component c)

// 移动组件到其所在层的最底部位置
void moveToBack(Component c)

// 设置组件在其所在层的位置,其中 position 取值范围为: [-1, n - 1],n 表示层内组件数量,其中 -1 表示最底,0 表示最顶
void setPosition(Component c, int position)

2. 代码实例

代码如下:

import com.lijinjiang.beautyeye.BeautyEyeLNFHelper;
import javax.swing.*;
import java.awt.*;

public class Demo01 {
    private static JPanel createPanel(Color bg, int x, int y, int width, int height) {
        JPanel panel = new JPanel(); // 创建一个JPanel
        panel.setOpaque(true); // 设置不透明
        panel.setBackground(bg); // 设置背景颜色
        panel.setBounds(x, y, width, height); // 设置面板的位置和宽高
        return panel;
    }

    public static void main(String[] args) {
        try {
            BeautyEyeLNFHelper.frameBorderStyle = BeautyEyeLNFHelper.FrameBorderStyle.generalNoTranslucencyShadow;
            BeautyEyeLNFHelper.launchBeautyEyeLNF();
        } catch (Exception e) {
            e.printStackTrace();
        }
        JFrame frame = new JFrame();
        frame.setTitle("Demo01"); // 设置窗口标题
        frame.setSize(400, 300); // 设置窗口显示大小

        JLayeredPane layeredPane = new JLayeredPane(); // 创建层级面板

        JPanel panel01 = createPanel(Color.RED, 90, 30, 100, 100);
        layeredPane.add(panel01, new Integer(100));
        JPanel panel02 = createPanel(Color.YELLOW, 150, 50, 100, 100);
        layeredPane.add(panel02, new Integer(100), 0);
        JPanel panel03 = createPanel(Color.BLUE, 120, 90, 100, 100);
        layeredPane.add(panel03, new Integer(100), 1);
        JPanel panel04 = createPanel(Color.GREEN, 170, 110, 100, 100);
        layeredPane.add(panel04, new Integer(200));

        frame.add(layeredPane);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口默认关闭操作
        frame.setLocationRelativeTo(null); // 相对屏幕居中
        frame.setVisible(true); // 设置窗口可见
    }
}

3.效果演示

AutomationElement 层级 plater层级_Swing_02