java.lang.Object
java.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JLayer<V>
- 类型参数:
-
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 不支持以下方法:
Container.add(java.awt.Component)Container.add(String, java.awt.Component)Container.add(java.awt.Component, int)Container.add(java.awt.Component, Object)Container.add(java.awt.Component, Object, int)
UnsupportedOperationException,要向 JLayer 添加组件,请使用 setView(Component) 或 setGlassPane(JPanel)。
- 自 JDK 版本:
- 1.7
- 参见:
-
Nested Class Summary
Nested classes/interfaces declared in class javax.swing.JComponent
JComponent.AccessibleJComponentNested classes/interfaces declared in class java.awt.Container
Container.AccessibleAWTContainerNested classes/interfaces declared in class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy -
Field Summary
Fields declared in class javax.swing.JComponent
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOWFields declared in class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENTFields declared in interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected void此方法不受JLayer支持,始终会抛出UnsupportedOperationException。由构造方法调用以创建默认的glassPane。voiddoLayout()将其功能委托给LayerUI.doLayout(JLayer)方法,如果设置了LayerUI。获取与此JLayer关联的 AccessibleContext。如果视图组件是javax.swing.JComponent的实例,则将其功能委托给getView().getBorder()方法,否则返回null。返回JLayer的 glassPane 组件或null。long返回要由此JLayer及其LayerUI接收的事件掩码的位图。返回视图组件的视口的首选大小。intgetScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) 返回滚动增量,用于显示逻辑行或列的组件,以便完全显示一个块的行或列,具体取决于方向的值。boolean返回false以指示视口的高度不确定定位层的高度,除非层的首选高度小于视口的高度。boolean返回false以指示视口的宽度不确定定位层的宽度,除非层的首选宽度小于视口的宽度。intgetScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) 返回滚动增量,用于显示逻辑行或列的组件,以便完全显示一个新的行或列,具体取决于方向的值。getUI()返回此JLayer的LayerUI。getView()返回JLayer的视图组件或null。booleanimageUpdate(Image img, int infoflags, int x, int y, int w, int h) 如果设置了LayerUI,则将其功能委托给LayerUI.imageUpdate(java.awt.Image, int, int, int, int, int, JLayer)方法。booleanJLayer重写了此方法的默认实现(在JComponent中)以返回false。protected boolean始终返回true,以使绘制源自JLayer或其祖先之一。void将所有绘制委托给LayerUI对象。protected void此方法为空,因为所有绘制都由paint(Graphics)和ComponentUI.update(Graphics, JComponent)方法完成。voidpaintImmediately(int x, int y, int w, int h) 如果设置了LayerUI,则将其功能委托给LayerUI.paintImmediately(int, int, int, int, JLayer)方法。void当绑定属性更改时调用此方法。void如果视图组件是javax.swing.JComponent的实例,则将其功能委托给getView().setBorder(Border)方法,否则此方法不执行任何操作。voidsetGlassPane(JPanel glassPane) 设置JLayer的 glassPane 组件,可以为null。voidsetLayerEventMask(long layerEventMask) 使来自JLayer及其所有后代的事件由指定的事件掩码参数传递到LayerUI.eventDispatched(AWTEvent, JLayer)方法。voidsetLayout(LayoutManager mgr) 为此容器设置布局管理器。void设置将为此JLayer执行绘制并接收输入事件的LayerUI。void设置JLayer的视图组件,可以为null。voidupdateUI()如果设置了LayerUI,则将其功能委托给LayerUI.updateUI(JLayer)方法。Methods declared in class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getToolTipText, getTopLevelAncestor, getTransferHandler, getUIClassID, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isPaintingForPrint, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paintBorder, paintChildren, paintImmediately, paramString, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, processMouseEvent, processMouseMotionEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, updateMethods declared in class java.awt.Container
add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, transferFocusDownCycle, validate, validateTreeMethods declared in class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setMixingCutoutShape, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
-
Constructor Details
-
Method Details
-
getView
返回JLayer的视图组件或null。
这是一个绑定属性。- 返回:
-
JLayer的视图组件或null(如果不存在) - 参见:
-
setView
设置JLayer的视图组件,可以是null。
这是一个绑定属性。- 参数:
-
view- 此JLayer的视图组件 - 参见:
-
setUI
设置将执行绘制并接收输入事件的JLayer的LayerUI。- 参数:
-
ui- 此JLayer的LayerUI
-
getUI
返回此JLayer的LayerUI。- 覆盖:
-
getUI在类JComponent - 返回:
-
此
JLayer的LayerUI
-
getGlassPane
返回JLayer的glassPane组件或null。
这是一个绑定属性。- 返回:
-
JLayer的glassPane组件或null(如果不存在) - 参见:
-
setGlassPane
设置JLayer的glassPane组件,可以是null。
这是一个绑定属性。- 参数:
-
glassPane- 此JLayer的glassPane组件 - 参见:
-
createGlassPane
由构造方法调用以创建默认的glassPane。默认情况下,此方法创建一个新的JPanel,可见性设置为true,不透明度设置为false。- 返回:
-
默认的
glassPane
-
setLayout
为此容器设置布局管理器。覆盖此方法以防止设置布局管理器。注意:如果
mgr非null,此方法将抛出异常,因为不支持在JLayer上设置布局管理器。- 覆盖:
-
setLayout在类Container - 参数:
-
mgr- 指定的布局管理器 - 抛出:
-
IllegalArgumentException- 不支持此方法 - 参见:
-
setBorder
将其功能委托给getView().setBorder(Border)方法,如果视图组件是javax.swing.JComponent的实例,则此方法是无操作的。- 覆盖:
-
setBorder在类JComponent - 参数:
-
border- 要为view组件渲染的边框 - 参见:
-
getBorder
将其功能委托给getView().getBorder()方法,如果视图组件是javax.swing.JComponent的实例,则返回null。- 覆盖:
-
getBorder在类JComponent - 返回:
-
view组件的边框对象 - 参见:
-
addImpl
JLayer不支持此方法,始终抛出UnsupportedOperationException- 覆盖:
-
addImpl在类Container - 参数:
-
comp- 要添加的组件 -
constraints- 表达此组件的布局约束的对象 -
index- 要插入组件的容器列表中的位置,其中-1表示追加到末尾 - 抛出:
-
UnsupportedOperationException- 不支持此方法 - 参见:
-
isPaintingOrigin
protected boolean isPaintingOrigin()始终返回true,以使绘制源自JLayer或其祖先之一。- 覆盖:
-
isPaintingOrigin在类JComponent - 返回:
- true
- 参见:
-
paintImmediately
public void paintImmediately(int x, int y, int w, int h) 将其功能委托给LayerUI.paintImmediately(int, int, int, int, JLayer)方法,如果设置了LayerUI。- 覆盖:
-
paintImmediately在类JComponent - 参数:
-
x- 要绘制的区域的x值 -
y- 要绘制的区域的y值 -
w- 要绘制的区域的宽度 -
h- 要绘制的区域的高度 - 参见:
-
imageUpdate
将其功能委托给LayerUI.imageUpdate(java.awt.Image, int, int, int, int, int, JLayer)方法,如果设置了LayerUI。- 指定者:
-
imageUpdate在接口ImageObserver中 - 覆盖:
-
imageUpdate在类Component中 - 参数:
-
img- 被观察的图像 -
infoflags- 查看更多信息请参考imageUpdate -
x- x坐标 -
y- y坐标 -
w- 宽度 -
h- 高度 - 返回:
-
如果infoflags指示图像完全加载,则返回
false; 否则返回true。 - 参见:
-
paint
将所有绘画委托给LayerUI对象。- 覆盖:
-
paint在类JComponent中 - 参数:
-
g- 要渲染的Graphics - 参见:
-
paintComponent
这个方法是空的,因为所有绘画都由paint(Graphics)和ComponentUI.update(Graphics, JComponent)方法完成- 覆盖:
-
paintComponent在类JComponent中 - 参数:
-
g- 要保护的Graphics对象 - 参见:
-
isOptimizedDrawingEnabled
public boolean isOptimizedDrawingEnabled()JLayer覆盖了此方法的默认实现(在JComponent中),以返回false。这确保绘图机制将调用JLayer的paint实现,而不是直接向JLayer的子级发送消息。- 覆盖:
-
isOptimizedDrawingEnabled在类JComponent中 - 返回:
- false
-
propertyChange
当绑定属性发生变化时,将调用此方法。- 指定者:
-
propertyChange在接口PropertyChangeListener中 - 参数:
-
evt- 描述事件源和已更改属性的PropertyChangeEvent对象
-
setLayerEventMask
public void setLayerEventMask(long layerEventMask) 使来自JLayer和所有其后代的事件能够传递到LayerUI.eventDispatched(AWTEvent, JLayer)方法。只要为此
JLayer设置了LayerUI并且JLayer是可显示的,事件就会被传递。以下示例展示了如何在
LayerUI实现中正确使用此方法:public void installUI(JComponent c) { super.installUI(c); JLayer l = (JLayer) c; // 此LayerUI将仅接收键盘和焦点事件 l.setLayerEventMask(AWTEvent.KEY_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK); } public void uninstallUI(JComponent c) { super.uninstallUI(c); JLayer l = (JLayer) c; // JLayer必须返回到其初始状态 l.setLayerEventMask(0); }默认情况下,JLayer不接收任何事件,其事件掩码为0。- 参数:
-
layerEventMask- 要接收的事件类型的位掩码 - 参见:
-
getLayerEventMask
public long getLayerEventMask()返回此JLayer和其LayerUI要接收的事件掩码位图。这意味着
LayerUI.eventDispatched(AWTEvent, JLayer)方法将只接收与事件掩码匹配的事件。默认情况下,
JLayer不接收任何事件。- 返回:
-
此
JLayer要接收的事件类型的位掩码
-
updateUI
public void updateUI()将其功能委托给LayerUI.updateUI(JLayer)方法,如果设置了LayerUI。- 覆盖:
-
updateUI在类JComponent中 - 参见:
-
getPreferredScrollableViewportSize
返回视图组件的视口的首选大小。如果此层的视图组件实现了
Scrollable,则此方法将委托其实现给视图组件。- 指定者:
-
getPreferredScrollableViewportSize在接口Scrollable中 - 返回:
- 视图组件的视口的首选大小
- 参见:
-
getScrollableBlockIncrement
返回一个滚动增量,用于在显示逻辑行或列的组件中完全暴露一块行或列,取决于方向的值。如果此层的视图组件实现了
Scrollable,则此方法将委托其实现给视图组件。- 指定者:
-
getScrollableBlockIncrement在接口Scrollable中 - 参数:
-
visibleRect- 视口内可见的视图区域 -
orientation- SwingConstants.VERTICAL或SwingConstants.HORIZONTAL。 -
direction- 小于零向上/左滚动,大于零向下/右滚动。 - 返回:
- 指定方向滚动的“块”增量
- 参见:
-
getScrollableTracksViewportHeight
public boolean getScrollableTracksViewportHeight()返回false,表示视口的高度不确定层的高度,除非层的首选高度小于视口的高度。如果此层的视图组件实现了
Scrollable,则此方法将委托其实现给视图组件。- 指定由:
-
getScrollableTracksViewportHeight在接口Scrollable中 - 返回:
- 图层是否应该跟踪视口的高度
- 参见:
-
getScrollableTracksViewportWidth
public boolean getScrollableTracksViewportWidth()返回false表示视口的宽度不确定图层的宽度,除非图层的首选宽度小于视口的宽度。如果此图层的视图组件实现了
Scrollable,则此方法将委托其实现给视图组件。- 指定由:
-
getScrollableTracksViewportWidth在接口Scrollable中 - 返回:
- 图层是否应该跟踪视口的宽度
- 参见:
-
getScrollableUnitIncrement
返回滚动增量,用于在显示逻辑行或列的组件中完全显示一个新行或列,取决于方向的值。理想情况下,组件应该通过返回完全显示该项所需的距离来处理部分暴露的行或列。滚动容器,如
JScrollPane,每次用户请求单位滚动时都会使用此方法。如果此图层的视图组件实现了
Scrollable,则此方法将委托其实现给视图组件。- 指定由:
-
getScrollableUnitIncrement在接口Scrollable中 - 参数:
-
visibleRect- 视口内可见的视图区域 -
orientation- SwingConstants.VERTICAL或SwingConstants.HORIZONTAL。 -
direction- 小于零向上/向左滚动,大于零向下/向右滚动。 - 返回:
- 指定方向的“单位”增量。此值应始终为正值。
- 参见:
-
doLayout
public void doLayout()如果设置了LayerUI,则将其功能委托给LayerUI.doLayout(JLayer)方法。 -
getAccessibleContext
获取与此JLayer关联的AccessibleContext。- 指定由:
-
getAccessibleContext在接口Accessible中 - 覆盖:
-
getAccessibleContext在类Component中 - 返回:
-
与此
JLayer关联的AccessibleContext。
-