Module java.desktop
Package javax.swing

Class JLayer<V extends Component>

类型参数:
V - JLayer 的视图组件的类型
所有实现的接口:
ImageObserver, MenuContainer, PropertyChangeListener, Serializable, EventListener, Accessible, Scrollable

public final class JLayer<V extends Component> extends JComponent implements Scrollable, PropertyChangeListener, Accessible
JLayer 是 Swing 组件的通用装饰器,使您能够实现各种高级绘制效果,并接收其边界内生成的所有 AWTEvent 的通知。

JLayer 将绘制和输入事件的处理委托给一个 LayerUI 对象,该对象执行实际的装饰。

LayerUI 中实现的自定义绘制和事件通知适用于 JLayer 本身及其所有子组件。这种组合使您能够通过添加新的高级功能(例如临时锁定层次结构、复合组件的数据提示、增强的鼠标滚动等)来丰富现有组件。

JLayer 是一个很好的解决方案,如果您只需要在复合组件上进行自定义绘制或捕获其子组件的输入事件。

 import javax.swing.*;
 import javax.swing.plaf.LayerUI;
 import java.awt.*;

 public class JLayerSample {

     private static JLayer<JComponent> createLayer() {
         // 这个自定义的 LayerUI 将用半透明绿色填充层,并打印出其边界内生成的所有鼠标移动事件
         LayerUI<JComponent> layerUI = new LayerUI<JComponent>() {

             public void paint(Graphics g, JComponent c) {
                 // 原样绘制层
                 super.paint(g, c);
                 // 用半透明绿色填充
                 g.setColor(new Color(0, 128, 0, 128));
                 g.fillRect(0, 0, c.getWidth(), c.getHeight());
             }

             public void installUI(JComponent c) {
                 super.installUI(c);
                 // 为层的子组件启用鼠标移动事件
                 ((JLayer) c).setLayerEventMask(AWTEvent.MOUSE_MOTION_EVENT_MASK);
             }

             public void uninstallUI(JComponent c) {
                 super.uninstallUI(c);
                 // 重置层事件掩码
                 ((JLayer) c).setLayerEventMask(0);
             }

             // 捕获鼠标移动事件的重写方法
             public void eventDispatched(AWTEvent e, JLayer<? extends JComponent> l) {
                 System.out.println("检测到 AWTEvent: " + e);
             }
         };
         // 创建一个要用该层装饰的组件
         JPanel panel = new JPanel();
         panel.add(new JButton("JButton"));

         // 使用我们的自定义 LayerUI 为面板创建层
         return new JLayer<JComponent>(panel, layerUI);
     }

     private static void createAndShowGUI() {
         final JFrame frame = new JFrame();
         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

         // 与任何其他 Swing 组件一样处理层
         frame.add(createLayer());

         frame.setSize(200, 200);
         frame.setLocationRelativeTo(null);
         frame.setVisible(true);
     }

     public static void main(String[] args) throws Exception {
         SwingUtilities.invokeAndWait(new Runnable() {
             public void run() {
                 createAndShowGUI();
             }
         });
     }
 }
 
注意: JLayer 不支持以下方法: 使用它们中的任何一个将导致抛出 UnsupportedOperationException,要向 JLayer 添加组件,请使用 setView(Component)setGlassPane(JPanel)
自 JDK 版本:
1.7
参见: