JLayeredPane 分层面板叠加详解
JLayeredPane 是 Java Swing 中用于实现图层叠加管理的容器,允许组件在 Z 轴方向分层显示。

核心概念
层级结构:底层 → 高层
Integer.MAX_VALUE (Draggable组件)
↓
300 (弹出窗口/对话框)
↓
200 (调色板/浮动工具)
↓
100 (默认层)
↓
-30000 (最低层)
预定义层级常量
| 常量 | 值 | 用途 |
|---|---|---|
| DEFAULT_LAYER | 0 | 标准组件层 |
| PALETTE_LAYER | 100 | 工具面板层 |
| MODAL_LAYER | 200 | 模态对话框层 |
| POPUP_LAYER | 300 | 弹出窗口层 |
| DRAG_LAYER | 400 | 拖拽组件层 |
基本使用方法
import javax.swing.*;
import java.awt.*;
public class LayeredPaneExample extends JFrame {
public LayeredPaneExample() {
setTitle("JLayeredPane 示例");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 创建分层面板
JLayeredPane layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(new Dimension(400, 300));
// 创建三个不同颜色的面板
JPanel redPanel = createColoredPanel(Color.RED, 300, 200);
redPanel.setBounds(20, 20, 300, 200);
JPanel greenPanel = createColoredPanel(Color.GREEN, 250, 150);
greenPanel.setBounds(50, 50, 250, 150);
JPanel bluePanel = createColoredPanel(Color.BLUE, 200, 100);
bluePanel.setBounds(80, 80, 200, 100);
// 添加到不同层级
layeredPane.add(redPanel, JLayeredPane.DEFAULT_LAYER); // 层级0
layeredPane.add(greenPanel, JLayeredPane.PALETTE_LAYER); // 层级100
layeredPane.add(bluePanel, JLayeredPane.MODAL_LAYER); // 层级200
add(layeredPane);
pack();
setLocationRelativeTo(null);
}
private JPanel createColoredPanel(Color color, int width, int height) {
JPanel panel = new JPanel();
panel.setBackground(color);
panel.setSize(width, height);
return panel;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new LayeredPaneExample().setVisible(true);
});
}
}
图层操作核心方法
// 添加组件到指定层级 layeredPane.add(component, layer); layeredPane.add(component, new Integer(layer)); // 同时设置位置 layeredPane.add(component, JLayeredPane.MODAL_LAYER, 1); // 第二个参数是层,第三个是位置索引 // 移动图层 layeredPane.setLayer(component, newLayer); // 获取组件的层级 int layer = layeredPane.getLayer(component); // 获取某层上的组件 Component[] components = layeredPane.getComponentsInLayer(layer); // 改变图层顺序 layeredPane.moveToFront(component); // 移到最前 layeredPane.moveToBack(component); // 移到最后
完整示例:可拖拽的卡片
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class DragCardExample extends JFrame {
private JLayeredPane layeredPane;
private Point mouseOffset;
public DragCardExample() {
setTitle("可拖拽卡片示例");
setSize(500, 400);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
layeredPane = new JLayeredPane();
layeredPane.setPreferredSize(new Dimension(500, 400));
// 创建三个卡片
JPanel card1 = createCard("卡片1", Color.RED, 100, 100);
JPanel card2 = createCard("卡片2", Color.GREEN, 200, 150);
JPanel card3 = createCard("卡片3", Color.BLUE, 150, 80);
// 添加卡片到不同层级
layeredPane.add(card1, JLayeredPane.DEFAULT_LAYER);
layeredPane.add(card2, JLayeredPane.PALETTE_LAYER);
layeredPane.add(card3, JLayeredPane.MODAL_LAYER);
add(layeredPane);
pack();
setLocationRelativeTo(null);
}
private JPanel createCard(String text, Color bgColor, int x, int y) {
JPanel card = new JPanel() {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
setBackground(bgColor);
}
};
card.setBounds(x, y, 120, 80);
card.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
JLabel label = new JLabel(text, SwingConstants.CENTER);
label.setForeground(Color.WHITE);
label.setFont(new Font("Arial", Font.BOLD, 14));
card.add(label);
// 添加拖拽功能
addDragFunctionality(card);
return card;
}
private void addDragFunctionality(JPanel card) {
card.addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
// 当点击时,将卡片移到最上层
layeredPane.moveToFront(card);
// 记录鼠标偏移
mouseOffset = SwingUtilities.convertPoint(
card, e.getPoint(), layeredPane);
// 更新卡片位置
Point cardLocation = card.getLocation();
mouseOffset.x -= cardLocation.x;
mouseOffset.y -= cardLocation.y;
}
});
card.addMouseMotionListener(new MouseAdapter() {
@Override
public void mouseDragged(MouseEvent e) {
// 计算新位置
Point parentPoint = SwingUtilities.convertPoint(
card, e.getPoint(), layeredPane);
int newX = parentPoint.x - mouseOffset.x;
int newY = parentPoint.y - mouseOffset.y;
// 边界限制
newX = Math.max(0, Math.min(newX, layeredPane.getWidth() - card.getWidth()));
newY = Math.max(0, Math.min(newY, layeredPane.getHeight() - card.getHeight()));
card.setLocation(newX, newY);
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new DragCardExample().setVisible(true);
});
}
}
注意事项
- 必须设置组件位置和大小:使用
setBounds()或setLocation()+setSize() - 图层顺序:层级值越大,显示在最上面
- 透明度:上层组件的透明部分会显示下层组件
- 布局管理器:建议不使用布局管理器,手动设置位置
- 性能:大量图层叠加可能影响性能
应用场景
- 图像编辑软件(图层管理)
- 游戏开发(角色、背景、特效分层)
- 桌面应用(浮动工具栏、弹窗)
- 地图应用(不同信息层)
通过 JLayeredPane,你可以轻松实现复杂的界面叠加效果,创建更丰富的用户交互体验。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播