|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||
java.lang.Objectjava.awt.Component
java.awt.Container
javax.swing.JComponent
javax.swing.JLayer<V>
V - the type of JLayer's view componentpublic final class JLayer<V extends Component>
Disabled: no SafeJ information.
JLayer is a universal decorator for Swing components
which enables you to implement various advanced painting effects as well as
receive notifications of all AWTEvents generated within its borders.
JLayer delegates the handling of painting and input events to a
LayerUI object, which performs the actual decoration.
The custom painting implemented in the LayerUI and events notification
work for the JLayer itself and all its subcomponents.
This combination enables you to enrich existing components
by adding new advanced functionality such as temporary locking of a hierarchy,
data tips for compound components, enhanced mouse scrolling etc and so on.
JLayer is a good solution if you only need to do custom painting
over compound component or catch input events from its subcomponents.
import javax.swing.*;
import javax.swing.plaf.LayerUI;
import java.awt.*;
public class JLayerSample {
private static JLayer<JComponent> createLayer() {
// This custom layerUI will fill the layer with translucent green
// and print out all mouseMotion events generated within its borders
LayerUI<JComponent> layerUI = new LayerUI<JComponent>() {
public void paint(Graphics g, JComponent c) {
// paint the layer as is
super.paint(g, c);
// fill it with the translucent green
g.setColor(new Color(0, 128, 0, 128));
g.fillRect(0, 0, c.getWidth(), c.getHeight());
}
public void installUI(JComponent c) {
super.installUI(c);
// enable mouse motion events for the layer's subcomponents
((JLayer) c).setLayerEventMask(AWTEvent.MOUSE_MOTION_EVENT_MASK);
}
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
// reset the layer event mask
((JLayer) c).setLayerEventMask(0);
}
// overridden method which catches MouseMotion events
public void eventDispatched(AWTEvent e, JLayer<? extends JComponent> l) {
System.out.println("AWTEvent detected: " + e);
}
};
// create a component to be decorated with the layer
JPanel panel = new JPanel();
panel.add(new JButton("JButton"));
// create the layer for the panel using our custom layerUI
return new JLayer<JComponent>(panel, layerUI);
}
private static void createAndShowGUI() {
final JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// work with the layer as with any other Swing component
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();
}
});
}
}
Note: JLayer doesn't support the following methods:
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 to be thrown,
to add a component to JLayer
use setView(Component) or setGlassPane(JPanel).
JLayer(Component),
setView(Component),
getView(),
LayerUI,
JLayer(Component, LayerUI),
setUI(javax.swing.plaf.LayerUI),
getUI()| Nested Class Summary |
|---|
| Nested classes/interfaces inherited from class javax.swing.JComponent |
|---|
JComponent.AccessibleJComponent |
| Nested classes/interfaces inherited from class java.awt.Container |
|---|
Container.AccessibleAWTContainer |
| Nested classes/interfaces inherited from class java.awt.Component |
|---|
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy |
| Field Summary |
|---|
| Fields inherited from class javax.swing.JComponent |
|---|
accessibleContext, listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW |
| Fields inherited from class java.awt.Component |
|---|
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT |
| Fields inherited from interface java.awt.image.ImageObserver |
|---|
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH |
| Constructor Summary | |
|---|---|
JLayer()
Creates a new JLayer object with a null view component
and null LayerUI. |
|
JLayer(V view)
Creates a new JLayer object
with null LayerUI. |
|
JLayer(V view,
LayerUI<V> ui)
Creates a new JLayer object with the specified view component
and LayerUI object. |
|
| Method Summary | |
|---|---|
protected void |
addImpl(Component comp,
Object constraints,
int index)
This method is not supported by JLayer
and always throws UnsupportedOperationException |
void |
addNotify()
Notifies this component that it now has a parent component. |
JPanel |
createGlassPane()
Called by the constructor methods to create a default glassPane. |
JPanel |
getGlassPane()
Returns the JLayer's glassPane component or null. |
long |
getLayerEventMask()
Returns the bitmap of event mask to receive by this JLayer
and its LayerUI. |
Dimension |
getPreferredScrollableViewportSize()
Returns the preferred size of the viewport for a view component. |
int |
getScrollableBlockIncrement(Rectangle visibleRect,
int orientation,
int direction)
Returns a scroll increment, which is required for components that display logical rows or columns in order to completely expose one block of rows or columns, depending on the value of orientation. |
boolean |
getScrollableTracksViewportHeight()
Returns false to indicate that the height of the viewport does not
determine the height of the layer, unless the preferred height
of the layer is smaller than the height of the viewport. |
boolean |
getScrollableTracksViewportWidth()
Returns false to indicate that the width of the viewport does not
determine the width of the layer, unless the preferred width
of the layer is smaller than the width of the viewport. |
int |
getScrollableUnitIncrement(Rectangle visibleRect,
int orientation,
int direction)
Returns a scroll increment, which is required for components that display logical rows or columns in order to completely expose one new row or column, depending on the value of orientation. |
LayerUI<? super V> |
getUI()
Returns the LayerUI for this JLayer. |
V |
getView()
Returns the JLayer's view component or null. |
boolean |
isOptimizedDrawingEnabled()
To enable the correct painting of the glassPane and view component,
the JLayer overrides the default implementation of
this method to return false when the glassPane is visible. |
void |
paint(Graphics g)
Delegates all painting to the LayerUI object. |
protected void |
paintComponent(Graphics g)
This method is empty, because all painting is done by paint(Graphics) and
ComponentUI.update(Graphics, JComponent) methods |
void |
propertyChange(PropertyChangeEvent evt)
This method gets called when a bound property is changed. |
void |
remove(Component comp)
Removes the specified component from this container. |
void |
removeAll()
Removes all the components from this container. |
void |
removeNotify()
Notifies this component that it no longer has a parent component. |
void |
setGlassPane(JPanel glassPane)
Sets the JLayer's glassPane component, which can be null. |
void |
setLayerEventMask(long layerEventMask)
Sets the bitmask of event types to receive by this JLayer. |
void |
setUI(LayerUI<? super V> ui)
Sets the LayerUI which will perform painting
and receive input events for this JLayer. |
void |
setView(V view)
Sets the JLayer's view component, which can be null. |
void |
updateUI()
Delegates its functionality to the LayerUI.updateUI(JLayer) method,
if LayerUI is set. |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
| Constructor Detail |
|---|
public JLayer()
JLayer object with a null view component
and null LayerUI.
setView(V),
setUI(javax.swing.plaf.LayerUI super V>)public JLayer(V view)
JLayer object
with null LayerUI.
view - the component to be decorated by this JLayersetUI(javax.swing.plaf.LayerUI super V>)
public JLayer(V view,
LayerUI<V> ui)
JLayer object with the specified view component
and LayerUI object.
view - the component to be decoratedui - the LayerUI delegate
to be used by this JLayer| Method Detail |
|---|
public V getView()
JLayer's view component or null.
JLayer's view component
or null if none existssetView(Component)public void setView(V view)
JLayer's view component, which can be null.
view - the view component for this JLayergetView()public void setUI(LayerUI<? super V> ui)
LayerUI which will perform painting
and receive input events for this JLayer.
ui - the LayerUI for this JLayerpublic LayerUI<? super V> getUI()
LayerUI for this JLayer.
LayerUI for this JLayerpublic JPanel getGlassPane()
JLayer's glassPane component or null.
JLayer's glassPane component
or null if none existssetGlassPane(JPanel)public void setGlassPane(JPanel glassPane)
JLayer's glassPane component, which can be null.
glassPane - the glassPane component of this JLayergetGlassPane()public JPanel createGlassPane()
glassPane.
By default this method creates a new JPanel with visibility set to true
and opacity set to false.
glassPane
protected void addImpl(Component comp,
Object constraints,
int index)
JLayer
and always throws UnsupportedOperationException
addImpl in class Containercomp - the component to be addedconstraints - an object expressing layout constraints
for this componentindex - the position in the container's list at which to
insert the component, where -1
means append to the end
UnsupportedOperationException - this method is not supportedsetView(Component),
setGlassPane(JPanel)public void remove(Component comp)
removeLayoutComponent method.
This method changes layout-related information, and therefore, invalidates the component hierarchy. If the container has already been displayed, the hierarchy must be validated thereafter in order to reflect the changes.
remove in class Containercomp - the component to be removedContainer.add(java.awt.Component),
Container.invalidate(),
Container.validate(),
Container.remove(int)public void removeAll()
removeLayoutComponent method.
This method changes layout-related information, and therefore, invalidates the component hierarchy. If the container has already been displayed, the hierarchy must be validated thereafter in order to reflect the changes.
removeAll in class ContainerContainer.add(java.awt.Component),
Container.remove(int),
Container.invalidate()public void paint(Graphics g)
LayerUI object.
paint in class JComponentg - the Graphics to render toJComponent.paintComponent(java.awt.Graphics),
JComponent.paintBorder(java.awt.Graphics),
JComponent.paintChildren(java.awt.Graphics),
JComponent.getComponentGraphics(java.awt.Graphics),
JComponent.repaint(long, int, int, int, int)protected void paintComponent(Graphics g)
paint(Graphics) and
ComponentUI.update(Graphics, JComponent) methods
paintComponent in class JComponentg - the Graphics object to protectJComponent.paint(java.awt.Graphics),
ComponentUIpublic boolean isOptimizedDrawingEnabled()
glassPane and view component,
the JLayer overrides the default implementation of
this method to return false when the glassPane is visible.
isOptimizedDrawingEnabled in class JComponentJLayer's glassPane is visiblepublic void propertyChange(PropertyChangeEvent evt)
propertyChange in interface PropertyChangeListenerevt - A PropertyChangeEvent object describing the event source
and the property that has changed.public void setLayerEventMask(long layerEventMask)
JLayer.
Here is the list of the supported event types:
LayerUI is installed,
LayerUI.eventDispatched(AWTEvent, JLayer) method
will only receive events that match the event mask.
The following example shows how to correclty use this method
in the LayerUI implementations:
public void installUI(JComponent c) {
super.installUI(c);
JLayer l = (JLayer) c;
// this LayerUI will receive only key and focus events
l.setLayerEventMask(AWTEvent.KEY_EVENT_MASK | AWTEvent.FOCUS_EVENT_MASK);
}
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
JLayer l = (JLayer) c;
// JLayer must be returned to its initial state
l.setLayerEventMask(0);
}
By default JLayer receives no events.
layerEventMask - the bitmask of event types to receive
IllegalArgumentException - if the layerEventMask parameter
contains unsupported event typesgetLayerEventMask()public long getLayerEventMask()
JLayer
and its LayerUI.
It means that LayerUI.eventDispatched(AWTEvent, JLayer) method
will only receive events that match the event mask.
By default JLayer receives no events.
JLayerpublic void updateUI()
LayerUI.updateUI(JLayer) method,
if LayerUI is set.
updateUI in class JComponentJComponent.setUI(javax.swing.plaf.ComponentUI),
UIManager.getLookAndFeel(),
UIManager.getUI(javax.swing.JComponent)public Dimension getPreferredScrollableViewportSize()
null, this method delegates its
implementation to the LayerUI.getPreferredScrollableViewportSize(JLayer)
getPreferredScrollableViewportSize in interface ScrollableScrollable,
LayerUI.getPreferredScrollableViewportSize(JLayer)
public int getScrollableBlockIncrement(Rectangle visibleRect,
int orientation,
int direction)
null, this method delegates its
implementation to the LayerUI.getScrollableBlockIncrement(JLayer,Rectangle,int,int)
getScrollableBlockIncrement in interface ScrollablevisibleRect - The view area visible within the viewportorientation - Either SwingConstants.VERTICAL or SwingConstants.HORIZONTAL.direction - Less than zero to scroll up/left, greater than zero for down/right.
Scrollable,
LayerUI.getScrollableBlockIncrement(JLayer, Rectangle, int, int)public boolean getScrollableTracksViewportHeight()
false to indicate that the height of the viewport does not
determine the height of the layer, unless the preferred height
of the layer is smaller than the height of the viewport.
If the ui delegate of this layer is not null, this method delegates its
implementation to the LayerUI.getScrollableTracksViewportHeight(JLayer)
getScrollableTracksViewportHeight in interface ScrollableScrollable,
LayerUI.getScrollableTracksViewportHeight(JLayer)public boolean getScrollableTracksViewportWidth()
false to indicate that the width of the viewport does not
determine the width of the layer, unless the preferred width
of the layer is smaller than the width of the viewport.
If the ui delegate of this layer is not null, this method delegates its
implementation to the LayerUI.getScrollableTracksViewportWidth(JLayer)
getScrollableTracksViewportWidth in interface ScrollableScrollable,
LayerUI.getScrollableTracksViewportWidth(JLayer)
public int getScrollableUnitIncrement(Rectangle visibleRect,
int orientation,
int direction)
JScrollPane, will use this method
each time the user requests a unit scroll.
If the ui delegate of this layer is not null, this method delegates its
implementation to the LayerUI.getScrollableUnitIncrement(JLayer,Rectangle,int,int)
getScrollableUnitIncrement in interface ScrollablevisibleRect - The view area visible within the viewportorientation - Either SwingConstants.VERTICAL or SwingConstants.HORIZONTAL.direction - Less than zero to scroll up/left, greater than zero for down/right.
Scrollable,
LayerUI.getScrollableUnitIncrement(JLayer, Rectangle, int, int)public void addNotify()
KeyboardAction event listeners.
addNotify in class JComponentJComponent.registerKeyboardAction(java.awt.event.ActionListener, java.lang.String, javax.swing.KeyStroke, int)public void removeNotify()
KeyboardActions
set up in the the chain of parent components are removed.
removeNotify in class JComponentJComponent.registerKeyboardAction(java.awt.event.ActionListener, java.lang.String, javax.swing.KeyStroke, int)
|
|||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||