# Class LayerUI<V extends Component>

java.lang.Object
javax.swing.plaf.ComponentUI
javax.swing.plaf.LayerUI<V>

Type Parameters:
  `V` - one of the super types of `JLayer`'s view component

All Implemented Interfaces:
  `Serializable`

public class LayerUI<V extends Component> extends ComponentUI implements Serializable
The base class for all `JLayer`'s UI delegates.

`paint(java.awt.Graphics, javax.swing.JComponent)` method performs the painting of the `JLayer` and `eventDispatched(AWTEvent, JLayer)` method is notified about any `AWTEvent`s which have been generated by a `JLayer` or any of its subcomponents.

The `LayerUI` differs from the UI delegates of the other components, because it is LookAndFeel independent and is not updated by default when the system LookAndFeel is changed.

The subclasses of `LayerUI` can either be stateless and shareable by multiple `JLayer`s or not shareable.

Since:
  1.7
See Also:
  - `JLayer.setUI(LayerUI)`
  - `JLayer.setView(Component)`
  - `JLayer.getView()`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `LayerUI()`
  Constructs a `LayerUI`.

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `addPropertyChangeListener(PropertyChangeListener listener)`
  Adds a PropertyChangeListener to the listener list.
  `void`
  `addPropertyChangeListener(String propertyName, PropertyChangeListener listener)`
  Adds a PropertyChangeListener to the listener list for a specific property.
  `void`
  `applyPropertyChange(PropertyChangeEvent evt, JLayer<? extends V> l)`
  Notifies the `LayerUI` when any of its property are changed and enables updating every `JLayer` this `LayerUI` instance is set to.
  `void`
  `doLayout(JLayer<? extends V> l)`
  Causes the passed instance of `JLayer` to lay out its components.
  `void`
  `eventDispatched(AWTEvent e, JLayer<? extends V> l)`
  Processes `AWTEvent`s for `JLayer` and all its descendants to this `LayerUI` instance.
  `protected void`
  `firePropertyChange(String propertyName, Object oldValue, Object newValue)`
  Support for reporting bound property changes for Object properties.
  `int`
  `getBaseline(JComponent c, int width, int height)`
  If the `JLayer`'s view component is not `null`, this calls the view's `getBaseline()` method.
  `Component.BaselineResizeBehavior`
  `getBaselineResizeBehavior(JComponent c)`
  If the `JLayer`'s view component is not `null`, this returns the result of the view's `getBaselineResizeBehavior()` method.
  `Dimension`
  `getMaximumSize(JComponent c)`
  If the `JLayer`'s view component is not `null`, this returns the result of the view's `getMaximumSize()` method.
  `Dimension`
  `getMinimumSize(JComponent c)`
  If the `JLayer`'s view component is not `null`, this returns the result of the view's `getMinimalSize()` method.
  `Dimension`
  `getPreferredSize(JComponent c)`
  If the `JLayer`'s view component is not `null`, this returns the result of the view's `getPreferredSize()` method.
  `PropertyChangeListener[]`
  `getPropertyChangeListeners()`
  Returns an array of all the property change listeners registered on this component.
  `PropertyChangeListener[]`
  `getPropertyChangeListeners(String propertyName)`
  Returns an array of all the listeners which have been associated with the named property.
  `boolean`
  `imageUpdate(Image img, int infoflags, int x, int y, int w, int h, JLayer<? extends V> l)`
  Delegates its functionality to the default implementation of the `JLayer.imageUpdate` method which is inherited from `JLayer`'s base classes.
  `void`
  `installUI(JComponent c)`
  Configures the `JLayer` this `LayerUI` is set to.
  `void`
  `paint(Graphics g, JComponent c)`
  Paints the specified component.
  `void`
  `paintImmediately(int x, int y, int width, int height, JLayer<? extends V> l)`
  Paints the specified region in the `JLayer` this `LayerUI` is set to, immediately.
  `protected void`
  `processComponentEvent(ComponentEvent e, JLayer<? extends V> l)`
  Processes component events occurring on the `JLayer` or any of its subcomponents.
  `protected void`
  `processFocusEvent(FocusEvent e, JLayer<? extends V> l)`
  Processes focus events occurring on the `JLayer` or any of its subcomponents.
  `protected void`
  `processHierarchyBoundsEvent(HierarchyEvent e, JLayer<? extends V> l)`
  Processes hierarchy bounds event occurring on the `JLayer` or any of its subcomponents.
  `protected void`
  `processHierarchyEvent(HierarchyEvent e, JLayer<? extends V> l)`
  Processes hierarchy event occurring on the `JLayer` or any of its subcomponents.
  `protected void`
  `processInputMethodEvent(InputMethodEvent e, JLayer<? extends V> l)`
  Processes input event occurring on the `JLayer` or any of its subcomponents.
  `protected void`
  `processKeyEvent(KeyEvent e, JLayer<? extends V> l)`
  Processes key events occurring on the `JLayer` or any of its subcomponents.
  `protected void`
  `processMouseEvent(MouseEvent e, JLayer<? extends V> l)`
  Processes mouse events occurring on the `JLayer` or any of its subcomponents.
  `protected void`
  `processMouseMotionEvent(MouseEvent e, JLayer<? extends V> l)`
  Processes mouse motion event occurring on the `JLayer` or any of its subcomponents.
  `protected void`
  `processMouseWheelEvent(MouseWheelEvent e, JLayer<? extends V> l)`
  Processes mouse wheel event occurring on the `JLayer` or any of its subcomponents.
  `void`
  `removePropertyChangeListener(PropertyChangeListener listener)`
  Removes a PropertyChangeListener from the listener list.
  `void`
  `removePropertyChangeListener(String propertyName, PropertyChangeListener listener)`
  Removes a `PropertyChangeListener` from the listener list for a specific property.
  `void`
  `uninstallUI(JComponent c)`
  Reverses the configuration which was previously set in the `installUI(JComponent)` method.
  `void`
  `updateUI(JLayer<? extends V> l)`
  Invoked when `JLayer.updateUI()` is called by the `JLayer` this `LayerUI` is set to.

  ### Methods declared in class ComponentUI

  `contains, createUI, getAccessibleChild, getAccessibleChildrenCount, update`

  ### Methods declared in class Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Constructor Details

  - ### LayerUI

    public LayerUI()
    Constructs a `LayerUI`.

- ## Method Details

  - ### paint

    public void paint(Graphics g, JComponent c)
    Paints the specified component. Subclasses should override this method and use the specified `Graphics` object to render the content of the component.

    The default implementation paints the passed component as is.

    Overrides:
      `paint` in class `ComponentUI`
    Parameters:
      `g` - the `Graphics` context in which to paint
      `c` - the component being painted
    See Also:
      - `ComponentUI.update(Graphics, JComponent)`

  - ### eventDispatched

    public void eventDispatched(AWTEvent e, JLayer<? extends V> l)
    Processes `AWTEvent`s for `JLayer` and all its descendants to this `LayerUI` instance.

    To enable the `AWTEvent`s of a particular type, you call `JLayer.setLayerEventMask(long)` in `installUI(javax.swing.JComponent)` and set the layer event mask to `0` in `uninstallUI(javax.swing.JComponent)` after that. By default this method calls the appropriate `process<event` `type>Event` method for the given class of event.

    Note: Events are processed only for displayable `JLayer`s.

    Parameters:
      `e` - the event to be dispatched
      `l` - the layer this LayerUI is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `Component.isDisplayable()`
      - `processComponentEvent(ComponentEvent, JLayer)`
      - `processFocusEvent(FocusEvent, JLayer)`
      - `processKeyEvent(KeyEvent, JLayer)`
      - `processMouseEvent(MouseEvent, JLayer)`
      - `processMouseMotionEvent(MouseEvent, JLayer)`
      - `processInputMethodEvent(InputMethodEvent, JLayer)`
      - `processHierarchyEvent(HierarchyEvent, JLayer)`
      - `processMouseWheelEvent(MouseWheelEvent, JLayer)`

  - ### processComponentEvent

    protected void processComponentEvent(ComponentEvent e, JLayer<? extends V> l)
    Processes component events occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless component events are enabled for the `JLayer` objects, this `LayerUI` is set to. Component events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.COMPONENT_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `ComponentEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### processFocusEvent

    protected void processFocusEvent(FocusEvent e, JLayer<? extends V> l)
    Processes focus events occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless focus events are enabled for the `JLayer` objects, this `LayerUI` is set to. Focus events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.FOCUS_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `FocusEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### processKeyEvent

    protected void processKeyEvent(KeyEvent e, JLayer<? extends V> l)
    Processes key events occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless key events are enabled for the `JLayer` objects, this `LayerUI` is set to. Key events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.KEY_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `KeyEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### processMouseEvent

    protected void processMouseEvent(MouseEvent e, JLayer<? extends V> l)
    Processes mouse events occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless mouse events are enabled for the `JLayer` objects, this `LayerUI` is set to. Mouse events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.MOUSE_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `MouseEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### processMouseMotionEvent

    protected void processMouseMotionEvent(MouseEvent e, JLayer<? extends V> l)
    Processes mouse motion event occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless mouse motion events are enabled for the `JLayer` objects, this `LayerUI` is set to. Mouse motion events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.MOUSE_MOTION_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `MouseEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### processMouseWheelEvent

    protected void processMouseWheelEvent(MouseWheelEvent e, JLayer<? extends V> l)
    Processes mouse wheel event occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless mouse wheel events are enabled for the `JLayer` objects, this `LayerUI` is set to. Mouse wheel events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.MOUSE_WHEEL_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `MouseEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### processInputMethodEvent

    protected void processInputMethodEvent(InputMethodEvent e, JLayer<? extends V> l)
    Processes input event occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless input events are enabled for the `JLayer` objects, this `LayerUI` is set to. Input events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.INPUT_METHOD_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `InputMethodEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### processHierarchyEvent

    protected void processHierarchyEvent(HierarchyEvent e, JLayer<? extends V> l)
    Processes hierarchy event occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless hierarchy events are enabled for the `JLayer` objects, this `LayerUI` is set to. Hierarchy events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.HIERARCHY_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `HierarchyEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### processHierarchyBoundsEvent

    protected void processHierarchyBoundsEvent(HierarchyEvent e, JLayer<? extends V> l)
    Processes hierarchy bounds event occurring on the `JLayer` or any of its subcomponents.

    This method is not called unless hierarchy bounds events are enabled for the `JLayer` objects, this `LayerUI` is set to. Hierarchy bounds events are enabled in the overridden `installUI(JComponent)` method and should be disabled in the `uninstallUI(JComponent)` method after that.

        public void installUI(JComponent c) {
           super.installUI(c);
           JLayer l = (JLayer) c;
           l.setLayerEventMask(AWTEvent.HIERARCHY_BOUNDS_EVENT_MASK);
        }

        public void uninstallUI(JComponent c) {
            super.uninstallUI(c);
            JLayer l = (JLayer) c;
            l.setLayerEventMask(0);
        }

    Parameters:
      `e` - the `HierarchyEvent` to be processed
      `l` - the layer this `LayerUI` instance is set to
    See Also:
      - `JLayer.setLayerEventMask(long)`
      - `installUI(javax.swing.JComponent)`
      - `uninstallUI(javax.swing.JComponent)`

  - ### updateUI

    public void updateUI(JLayer<? extends V> l)
    Invoked when `JLayer.updateUI()` is called by the `JLayer` this `LayerUI` is set to.
    Parameters:
      `l` - the `JLayer` which UI is updated

  - ### installUI

    public void installUI(JComponent c)
    Configures the `JLayer` this `LayerUI` is set to. The default implementation registers the passed `JLayer` component as a `PropertyChangeListener` for the property changes of this `LayerUI`.
    Overrides:
      `installUI` in class `ComponentUI`
    Parameters:
      `c` - the `JLayer` component where this UI delegate is being installed
    See Also:
      - `ComponentUI.uninstallUI(JComponent)`
      - `JComponent.setUI(ComponentUI)`
      - `JComponent.updateUI()`

  - ### uninstallUI

    public void uninstallUI(JComponent c)
    Reverses the configuration which was previously set in the `installUI(JComponent)` method. The default implementation unregisters the passed `JLayer` component as a `PropertyChangeListener` for the property changes of this `LayerUI`.
    Overrides:
      `uninstallUI` in class `ComponentUI`
    Parameters:
      `c` - the component from which this UI delegate is being removed.
    See Also:
      - `ComponentUI.installUI(JComponent)`
      - `JComponent.updateUI()`

  - ### addPropertyChangeListener

    public void addPropertyChangeListener(PropertyChangeListener listener)
    Adds a PropertyChangeListener to the listener list. The listener is registered for all bound properties of this class.

    If `listener` is `null`, no exception is thrown and no action is performed.

    Parameters:
      `listener` - the property change listener to be added
    See Also:
      - `removePropertyChangeListener(PropertyChangeListener)`
      - `getPropertyChangeListeners()`
      - `addPropertyChangeListener(String, java.beans.PropertyChangeListener)`

  - ### removePropertyChangeListener

    public void removePropertyChangeListener(PropertyChangeListener listener)
    Removes a PropertyChangeListener from the listener list. This method should be used to remove PropertyChangeListeners that were registered for all bound properties of this class.

    If `listener` is `null`, no exception is thrown and no action is performed.

    Parameters:
      `listener` - the PropertyChangeListener to be removed
    See Also:
      - `addPropertyChangeListener(PropertyChangeListener)`
      - `getPropertyChangeListeners()`
      - `removePropertyChangeListener(String, PropertyChangeListener)`

  - ### getPropertyChangeListeners

    public PropertyChangeListener[] getPropertyChangeListeners()
    Returns an array of all the property change listeners registered on this component.
    Returns:
      all of this ui's `PropertyChangeListener`s or an empty array if no property change listeners are currently registered
    See Also:
      - `addPropertyChangeListener(PropertyChangeListener)`
      - `removePropertyChangeListener(PropertyChangeListener)`
      - `getPropertyChangeListeners(String)`

  - ### addPropertyChangeListener

    public void addPropertyChangeListener(String propertyName, PropertyChangeListener listener)
    Adds a PropertyChangeListener to the listener list for a specific property.

    If `propertyName` or `listener` is `null`, no exception is thrown and no action is taken.

    Parameters:
      `propertyName` - one of the property names listed above
      `listener` - the property change listener to be added
    See Also:
      - `removePropertyChangeListener(String, PropertyChangeListener)`
      - `getPropertyChangeListeners(String)`
      - `addPropertyChangeListener(String, PropertyChangeListener)`

  - ### removePropertyChangeListener

    public void removePropertyChangeListener(String propertyName, PropertyChangeListener listener)
    Removes a `PropertyChangeListener` from the listener list for a specific property. This method should be used to remove `PropertyChangeListener`s that were registered for a specific bound property.

    If `propertyName` or `listener` is `null`, no exception is thrown and no action is taken.

    Parameters:
      `propertyName` - a valid property name
      `listener` - the PropertyChangeListener to be removed
    See Also:
      - `addPropertyChangeListener(String, PropertyChangeListener)`
      - `getPropertyChangeListeners(String)`
      - `removePropertyChangeListener(PropertyChangeListener)`

  - ### getPropertyChangeListeners

    public PropertyChangeListener[] getPropertyChangeListeners(String propertyName)
    Returns an array of all the listeners which have been associated with the named property.
    Parameters:
      `propertyName` - The name of the property being listened to
    Returns:
      all of the `PropertyChangeListener`s associated with the named property; if no such listeners have been added or if `propertyName` is `null`, an empty array is returned
    See Also:
      - `addPropertyChangeListener(String, PropertyChangeListener)`
      - `removePropertyChangeListener(String, PropertyChangeListener)`
      - `getPropertyChangeListeners()`

  - ### firePropertyChange

    protected void firePropertyChange(String propertyName, Object oldValue, Object newValue)
    Support for reporting bound property changes for Object properties. This method can be called when a bound property has changed and it will send the appropriate PropertyChangeEvent to any registered PropertyChangeListeners.
    Parameters:
      `propertyName` - the property whose value has changed
      `oldValue` - the property's previous value
      `newValue` - the property's new value

  - ### applyPropertyChange

    public void applyPropertyChange(PropertyChangeEvent evt, JLayer<? extends V> l)
    Notifies the `LayerUI` when any of its property are changed and enables updating every `JLayer` this `LayerUI` instance is set to.
    Parameters:
      `evt` - the PropertyChangeEvent generated by this `LayerUI`
      `l` - the `JLayer` this LayerUI is set to

  - ### getBaseline

    public int getBaseline(JComponent c, int width, int height)
    If the `JLayer`'s view component is not `null`, this calls the view's `getBaseline()` method. Otherwise, the default implementation is called.
    Overrides:
      `getBaseline` in class `ComponentUI`
    Parameters:
      `c` - `JLayer` to return baseline resize behavior for
      `width` - the width to get the baseline for
      `height` - the height to get the baseline for
    Returns:
      baseline or a value < 0 indicating there is no reasonable baseline
    See Also:
      - `JComponent.getBaseline(int,int)`

  - ### getBaselineResizeBehavior

    public Component.BaselineResizeBehavior getBaselineResizeBehavior(JComponent c)
    If the `JLayer`'s view component is not `null`, this returns the result of the view's `getBaselineResizeBehavior()` method. Otherwise, the default implementation is called.
    Overrides:
      `getBaselineResizeBehavior` in class `ComponentUI`
    Parameters:
      `c` - `JLayer` to return baseline resize behavior for
    Returns:
      an enum indicating how the baseline changes as the component size changes
    See Also:
      - `JComponent.getBaseline(int, int)`

  - ### doLayout

    public void doLayout(JLayer<? extends V> l)
    Causes the passed instance of `JLayer` to lay out its components.
    Parameters:
      `l` - the `JLayer` component where this UI delegate is being installed

  - ### getPreferredSize

    public Dimension getPreferredSize(JComponent c)
    If the `JLayer`'s view component is not `null`, this returns the result of the view's `getPreferredSize()` method. Otherwise, the default implementation is used.
    Overrides:
      `getPreferredSize` in class `ComponentUI`
    Parameters:
      `c` - `JLayer` to return preferred size for
    Returns:
      preferred size for the passed `JLayer`
    See Also:
      - `JComponent.getPreferredSize()`
      - `LayoutManager.preferredLayoutSize(Container)`

  - ### getMinimumSize

    public Dimension getMinimumSize(JComponent c)
    If the `JLayer`'s view component is not `null`, this returns the result of the view's `getMinimalSize()` method. Otherwise, the default implementation is used.
    Overrides:
      `getMinimumSize` in class `ComponentUI`
    Parameters:
      `c` - `JLayer` to return preferred size for
    Returns:
      minimal size for the passed `JLayer`
    See Also:
      - `JComponent.getMinimumSize()`
      - `LayoutManager.minimumLayoutSize(Container)`
      - `ComponentUI.getPreferredSize(JComponent)`

  - ### getMaximumSize

    public Dimension getMaximumSize(JComponent c)
    If the `JLayer`'s view component is not `null`, this returns the result of the view's `getMaximumSize()` method. Otherwise, the default implementation is used.
    Overrides:
      `getMaximumSize` in class `ComponentUI`
    Parameters:
      `c` - `JLayer` to return preferred size for
    Returns:
      maximum size for the passed `JLayer`
    See Also:
      - `JComponent.getMaximumSize()`
      - `LayoutManager2.maximumLayoutSize(Container)`

  - ### paintImmediately

    public void paintImmediately(int x, int y, int width, int height, JLayer<? extends V> l)
    Paints the specified region in the `JLayer` this `LayerUI` is set to, immediately.

    This method is to be overridden when the dirty region needs to be changed. The default implementation delegates its functionality to `JComponent.paintImmediately(int, int, int, int)`.

    Parameters:
      `x` - the x value of the region to be painted
      `y` - the y value of the region to be painted
      `width` - the width of the region to be painted
      `height` - the height of the region to be painted
      `l` - a `JLayer` component
    See Also:
      - `JComponent.paintImmediately(int, int, int, int)`

  - ### imageUpdate

    public boolean imageUpdate(Image img, int infoflags, int x, int y, int w, int h, JLayer<? extends V> l)
    Delegates its functionality to the default implementation of the `JLayer.imageUpdate` method which is inherited from `JLayer`'s base classes.

    This method is to be overridden instead of `JLayer.imageUpdate`.

    Note: This method is usually called not on the Event Dispatching Thread.

    Parameters:
      `img` - the image being observed
      `infoflags` - see imageUpdate for information
      `x` - the x coordinate
      `y` - the y coordinate
      `w` - the width
      `h` - the height
      `l` - a `JLayer` component
    Returns:
      false if the infoflags indicate that the image is completely loaded; true otherwise