Class ChartPanel
- java.lang.Object
-
- java.awt.Component
-
- java.awt.Container
-
- javax.swing.JComponent
-
- javax.swing.JLayeredPane
-
- info.monitorenter.gui.chart.views.ChartPanel
-
- All Implemented Interfaces:
java.awt.image.ImageObserver
,java.awt.MenuContainer
,java.beans.PropertyChangeListener
,java.io.Serializable
,java.util.EventListener
,javax.accessibility.Accessible
public class ChartPanel extends javax.swing.JLayeredPane implements java.beans.PropertyChangeListener
A decoration forChart2D
that adds various controls for aChart2D
and it'sITrace2D
instances in form of popup menues.Performance note
The context menu items register themselves with the chart to adapt their basic UI properties (font, foreground color, background color) via weak referenced instances ofLayoutFactory.BasicPropertyAdaptSupport
. This ensures that dropping a complete menu tree from the UI makes them garbage collectable without introduction of highly unstable and unmaintainable active memory management code. A side effect is that these listeners remain in the property change listener list of the chart unless they are finalized.Adding and removing many traces to / from charts that are wrapped in
ChartPanel
withoutSystem.gc()
followed bySystem.runFinalization()
in your code will leave a huge amount of listeners for non-visible uncleaned menu items in the chart which causes a high cpu throttle for increasing the listener list.The reason seems to be the implementation of (
EventListenerList
that is used bySwingPropertyChangeSupport
). It is based upon an array an grows only for the space of an additional listener by usingSystem.arraycopy(java.lang.Object, int, java.lang.Object, int, int)
(ouch, this should be changed).Profiling a day with showed that up to 2000 dead listeners remained in the list. The cpu load increased after about 200 add / remove trace operations. Good news is that no memory leak could be detected.
If those add and remove trace operations on
ChartPanel
- connected charts are performed with intermediate UI action property change events on dead listeners will let them remove themselves from the listener list thus avoiding the cpu overhead. So UI / user - controlled applications will unlikely suffer from this problem.- Author:
- Achim Westermann
- See Also:
- Serialized Form
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class javax.swing.JLayeredPane
javax.swing.JLayeredPane.AccessibleJLayeredPane
-
Nested classes/interfaces inherited from class javax.swing.JComponent
javax.swing.JComponent.AccessibleJComponent
-
-
Field Summary
Fields Modifier and Type Field Description protected javax.swing.JPanel
m_labelPanel
An internal panel for the labels of the traces that uses aFlowLayout
.-
Fields inherited from class javax.swing.JLayeredPane
DEFAULT_LAYER, DRAG_LAYER, FRAME_CONTENT_LAYER, LAYER_PROPERTY, MODAL_LAYER, PALETTE_LAYER, POPUP_LAYER
-
Fields inherited from class javax.swing.JComponent
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
-
-
Constructor Summary
Constructors Constructor Description ChartPanel(Chart2D chart)
Creates an instance that decorates the given chart with controls in form of popup menus.ChartPanel(Chart2D chart, boolean adaptUI2Chart)
Creates an instance that decorates the given chart with controls in form of popup menus.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
equals(java.lang.Object obj)
IAnnotationCreator
getAnnotationCreator()
Returns the annotationCreator.Chart2D
getChart()
Returns the chart.int
hashCode()
static void
main(java.lang.String[] args)
Main enbtry for demo app.void
propertyChange(java.beans.PropertyChangeEvent evt)
Listens for property "background" of theChart2D
instance that is contained in this component and sets the background color.void
setAnnotationCreator(IAnnotationCreator annotationCreator)
Sets the annotationCreator.-
Methods inherited from class javax.swing.JLayeredPane
addImpl, getAccessibleContext, getComponentCountInLayer, getComponentsInLayer, getComponentToLayer, getIndexOf, getLayer, getLayer, getLayeredPaneAbove, getObjectForLayer, getPosition, highestLayer, insertIndexForLayer, isOptimizedDrawingEnabled, lowestLayer, moveToBack, moveToFront, paint, paramString, putLayer, remove, removeAll, setLayer, setLayer, setPosition
-
Methods inherited from class javax.swing.JComponent
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, 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, getUI, getUIClassID, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paintBorder, paintChildren, paintComponent, paintImmediately, paintImmediately, 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, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setDoubleBuffered, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setPreferredSize, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update, updateUI
-
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, 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, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree
-
Methods inherited from 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, 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, imageUpdate, 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 Detail
-
ChartPanel
public ChartPanel(Chart2D chart)
Creates an instance that decorates the given chart with controls in form of popup menus.- Parameters:
chart
- A configured Chart2D instance that will be displayed and controlled by this panel.
-
ChartPanel
public ChartPanel(Chart2D chart, boolean adaptUI2Chart)
Creates an instance that decorates the given chart with controls in form of popup menus.- Parameters:
chart
- A configured Chart2D instance that will be displayed and controlled by this panel.adaptUI2Chart
- if true the menu will adapt it's basic UI properties (font, foreground and background color) to the given chart.
-
-
Method Detail
-
main
public static void main(java.lang.String[] args)
Main enbtry for demo app.- Parameters:
args
- ignored.
-
equals
public boolean equals(java.lang.Object obj)
- Overrides:
equals
in classjava.lang.Object
- See Also:
Object.equals(java.lang.Object)
-
getAnnotationCreator
public final IAnnotationCreator getAnnotationCreator()
Returns the annotationCreator.- Returns:
- the annotationCreator
-
getChart
public final Chart2D getChart()
Returns the chart.- Returns:
- the chart
-
hashCode
public int hashCode()
- Overrides:
hashCode
in classjava.lang.Object
- See Also:
Object.hashCode()
-
propertyChange
public void propertyChange(java.beans.PropertyChangeEvent evt)
Listens for property "background" of theChart2D
instance that is contained in this component and sets the background color.- Specified by:
propertyChange
in interfacejava.beans.PropertyChangeListener
- See Also:
PropertyChangeListener.propertyChange(java.beans.PropertyChangeEvent)
-
setAnnotationCreator
public final void setAnnotationCreator(IAnnotationCreator annotationCreator)
Sets the annotationCreator.- Parameters:
annotationCreator
- the annotationCreator to set
-
-