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.AccessibleJComponent
Nested classes/interfaces declared in class java.awt.Container
Container.AccessibleAWTContainer
Nested 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_WINDOW
Fields declared in class java.awt.Component
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
Fields declared in interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
-
Constructor Summary
-
Method Summary
Modifier and TypeMethodDescriptionprotected void
此方法不受JLayer
支持,始终会抛出UnsupportedOperationException
。由构造方法调用以创建默认的glassPane
。void
doLayout()
将其功能委托给LayerUI.doLayout(JLayer)
方法,如果设置了LayerUI
。获取与此JLayer
关联的 AccessibleContext。如果视图组件是javax.swing.JComponent
的实例,则将其功能委托给getView().getBorder()
方法,否则返回null
。返回JLayer
的 glassPane 组件或null
。long
返回要由此JLayer
及其LayerUI
接收的事件掩码的位图。返回视图组件的视口的首选大小。int
getScrollableBlockIncrement
(Rectangle visibleRect, int orientation, int direction) 返回滚动增量,用于显示逻辑行或列的组件,以便完全显示一个块的行或列,具体取决于方向的值。boolean
返回false
以指示视口的高度不确定定位层的高度,除非层的首选高度小于视口的高度。boolean
返回false
以指示视口的宽度不确定定位层的宽度,除非层的首选宽度小于视口的宽度。int
getScrollableUnitIncrement
(Rectangle visibleRect, int orientation, int direction) 返回滚动增量,用于显示逻辑行或列的组件,以便完全显示一个新的行或列,具体取决于方向的值。getUI()
返回此JLayer
的LayerUI
。getView()
返回JLayer
的视图组件或null
。boolean
imageUpdate
(Image img, int infoflags, int x, int y, int w, int h) 如果设置了LayerUI
,则将其功能委托给LayerUI.imageUpdate(java.awt.Image, int, int, int, int, int, JLayer)
方法。boolean
JLayer
重写了此方法的默认实现(在JComponent
中)以返回false
。protected boolean
始终返回true
,以使绘制源自JLayer
或其祖先之一。void
将所有绘制委托给LayerUI
对象。protected void
此方法为空,因为所有绘制都由paint(Graphics)
和ComponentUI.update(Graphics, JComponent)
方法完成。void
paintImmediately
(int x, int y, int w, int h) 如果设置了LayerUI
,则将其功能委托给LayerUI.paintImmediately(int, int, int, int, JLayer)
方法。void
当绑定属性更改时调用此方法。void
如果视图组件是javax.swing.JComponent
的实例,则将其功能委托给getView().setBorder(Border)
方法,否则此方法不执行任何操作。void
setGlassPane
(JPanel glassPane) 设置JLayer
的 glassPane 组件,可以为null
。void
setLayerEventMask
(long layerEventMask) 使来自JLayer
及其所有后代的事件由指定的事件掩码参数传递到LayerUI.eventDispatched(AWTEvent, JLayer)
方法。void
setLayout
(LayoutManager mgr) 为此容器设置布局管理器。void
设置将为此JLayer
执行绘制并接收输入事件的LayerUI
。void
设置JLayer
的视图组件,可以为null
。void
updateUI()
如果设置了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, update
Methods 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, validateTree
Methods 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。
-