This document describes the foundational abstractions that underpin all PatternFly Java components. It covers BaseComponent, the generic class from which all components inherit; ComponentContext, the key-value storage mechanism; HasIdentifier, the interface for unique component identification; and the mixin-based interface pattern that enables behavioral composition without deep inheritance hierarchies.
For information about collection management patterns across container components, see Collection Management. For event handling patterns, see Event Handling Pattern.
PatternFly Java components follow a carefully designed architecture that prioritizes:
The foundation consists of:
| Abstraction | Role | Key Methods |
|---|---|---|
BaseComponent | Base class for all components | css(), aria(), element(), that() |
ComponentContext | Key-value storage interface | store(), has(), get() |
HasIdentifier | Unique identification interface | identifier() |
| Mixin interfaces | Behavioral capabilities | disabled(), icon(), text(), etc. |
Sources: components/src/main/java/org/patternfly/component/menu/MenuToggle.java72-80 components/src/main/java/org/patternfly/component/table/Tr.java85-89 components/src/main/java/org/patternfly/component/button/Button.java82-93
BaseComponent is the abstract generic base class from which all PatternFly components inherit. It provides core functionality for DOM element management, CSS class manipulation, ARIA attribute management, and fluent API method chaining.
E: The HTML element type (e.g., HTMLButtonElement, HTMLDivElement)B: The concrete component type for fluent method chaining (self-referential type)This pattern enables type-safe method chaining where each method returns the concrete component type rather than BaseComponent.
Sources: components/src/main/java/org/patternfly/component/button/Button.java82 components/src/main/java/org/patternfly/component/menu/MenuToggle.java72
Sources: components/src/main/java/org/patternfly/component/button/Button.java150-161 components/src/main/java/org/patternfly/component/menu/MenuToggle.java149-181
All components follow a consistent construction pattern:
ComponentType, applies base CSS classesstoreComponent() registers the component for later lookupthat() returns the concrete type for continued chainingExample from Button:
components/src/main/java/org/patternfly/component/button/Button.java150-161
Example from MenuToggle:
components/src/main/java/org/patternfly/component/menu/MenuToggle.java149-181
Sources: components/src/main/java/org/patternfly/component/button/Button.java95-139 components/src/main/java/org/patternfly/component/menu/MenuToggle.java84-130
that() PatternThe that() method is critical for type-safe method chaining. It returns this cast to the concrete component type B:
This enables fluent APIs where each method returns the concrete type:
Every component must implement that() to return its own type.
Sources: components/src/main/java/org/patternfly/component/button/Button.java315-317 components/src/main/java/org/patternfly/component/menu/MenuToggle.java381-383
BaseComponent provides a component registry mechanism that allows components to be stored and retrieved from the DOM:
storeComponent(): Stores the component instance in a static registry keyed by the elementlookupComponent(): Retrieves the component instance from the DOM element or its ancestorslookupComponent(boolean): Lenient lookup that returns null if not found instead of throwingThis enables child components to access their parent containers without explicit reference passing.
Example usage in Td:
components/src/main/java/org/patternfly/component/table/Td.java99-103
Sources: components/src/main/java/org/patternfly/component/table/Td.java89-106 components/src/main/java/org/patternfly/component/table/Tr.java213
ComponentContext<E, B> provides a generic key-value storage mechanism attached to each component instance. This enables components to store arbitrary application data without requiring inheritance or field declarations.
Components implementing ComponentContext maintain a Map<String, Object> for storage:
components/src/main/java/org/patternfly/component/table/Tr.java124
The methods delegate to the map:
components/src/main/java/org/patternfly/component/table/Tr.java239-242 components/src/main/java/org/patternfly/component/table/Tr.java427-437
components/src/main/java/org/patternfly/component/table/Cell.java67-88
This pattern is commonly used in table rows to associate domain objects with UI rows without requiring custom subclasses.
Sources: components/src/main/java/org/patternfly/component/table/Tr.java85-89 components/src/main/java/org/patternfly/component/table/Cell.java34-37
HasIdentifier<E, B> provides a standardized mechanism for component identification. Each component implementing this interface has a unique string identifier that enables lookup and reference.
Components store the identifier as a final field and register it in the DOM dataset:
components/src/main/java/org/patternfly/component/table/Tr.java122 components/src/main/java/org/patternfly/component/table/Tr.java135-148
components/src/main/java/org/patternfly/component/table/Cell.java39 components/src/main/java/org/patternfly/component/table/Cell.java42-47
Identifiers serve multiple purposes:
data-pf-identifier for debuggingExample usage in Table:
components/src/main/java/org/patternfly/component/table/Table.java226-236
Sources: components/src/main/java/org/patternfly/component/table/Tr.java85-89 components/src/main/java/org/patternfly/component/table/Cell.java34-37 components/src/main/java/org/patternfly/component/table/Table.java226-236
PatternFly Java uses interface composition to provide component capabilities rather than deep inheritance hierarchies. Each interface represents a specific behavioral capability (e.g., disabled, icon, text) and provides default implementations where appropriate.
Sources: components/src/main/java/org/patternfly/component/menu/MenuToggle.java72-80 components/src/main/java/org/patternfly/component/button/Button.java82-93
MenuToggle demonstrates extensive interface composition:
components/src/main/java/org/patternfly/component/menu/MenuToggle.java72-80
This provides:
ComponentIcon: Methods for adding/removing iconsComponentIconAndText: Combined icon and text placementDisabled: Enable/disable functionalityElementTextMethods: Text content managementFullHeight / FullWidth: Size modifiersPrimary / Secondary: Visual styling variantsSources: components/src/main/java/org/patternfly/component/menu/MenuToggle.java72-80
Many mixin interfaces provide default implementations that manipulate CSS classes:
Components simply implement the interface to gain the capability:
Sources: components/src/main/java/org/patternfly/component/button/Button.java82-93
The Disabled interface demonstrates a more complex mixin with both CSS and DOM manipulation:
Components can override this to add additional behavior:
components/src/main/java/org/patternfly/component/menu/MenuToggle.java276-290
This override:
Disabled.super.disabled(disabled)this for continued chainingSources: components/src/main/java/org/patternfly/component/menu/MenuToggle.java276-290 components/src/main/java/org/patternfly/component/button/Button.java278-286
Provides methods for managing icons in components:
Example implementation in Button:
components/src/main/java/org/patternfly/component/button/Button.java183-195
Sources: components/src/main/java/org/patternfly/component/button/Button.java183-195
Combines icon and text with positional control:
Example implementation in Button with position handling:
components/src/main/java/org/patternfly/component/button/Button.java197-213
Sources: components/src/main/java/org/patternfly/component/button/Button.java197-213
Provides typed value management:
Example implementation in Checkbox:
components/src/main/java/org/patternfly/component/form/Checkbox.java62-66 components/src/main/java/org/patternfly/component/form/Checkbox.java232-235
Sources: components/src/main/java/org/patternfly/component/form/Checkbox.java62-66
Components manage internal DOM structure while exposing the root element. Child elements are created lazily and cached:
components/src/main/java/org/patternfly/component/button/Button.java342-354
This pattern:
Sources: components/src/main/java/org/patternfly/component/button/Button.java342-354
add() Method Override PatternComponents often override add() methods to control where child elements are inserted:
components/src/main/java/org/patternfly/component/menu/MenuToggle.java189-197
This ensures avatars are inserted in the correct container with proper CSS classes, rather than simply appended to the root element.
Sources: components/src/main/java/org/patternfly/component/menu/MenuToggle.java189-197 components/src/main/java/org/patternfly/component/menu/MenuToggle.java203-212
Text content is managed through dedicated container elements:
components/src/main/java/org/patternfly/component/menu/MenuToggle.java321-344
This approach:
textContent on subsequent callsSources: components/src/main/java/org/patternfly/component/menu/MenuToggle.java321-344
BaseComponent provides several methods for CSS class management:
css(String...): Adds one or more CSS classesclassList(): Returns the DOMTokenList for direct manipulationtoggle(String, boolean): Conditionally adds/removes a classExample usage:
components/src/main/java/org/patternfly/component/menu/MenuToggle.java315-318
Sources: components/src/main/java/org/patternfly/component/menu/MenuToggle.java315-318
Components use aria() methods to set ARIA attributes:
components/src/main/java/org/patternfly/component/menu/MenuToggle.java387-390
Common patterns:
aria(Aria.expanded, boolean): For expandable componentsaria(Aria.label, String): For accessible labelsaria(Aria.disabled, boolean): For disabled statearia(Aria.level, int): For hierarchical componentsSources: components/src/main/java/org/patternfly/component/menu/MenuToggle.java387-390 components/src/main/java/org/patternfly/component/table/Tr.java274-308
Common HTML attributes are defined in the Attributes interface:
core/src/main/java/org/patternfly/core/Attributes.java18-26
Sources: core/src/main/java/org/patternfly/core/Attributes.java18-26
| Component | E Parameter | B Parameter |
|---|---|---|
Button | HTMLElement | Button |
MenuToggle | HTMLElement | MenuToggle |
Table | HTMLTableElement | Table |
Tr | HTMLTableRowElement | Tr |
Checkbox | HTMLElement | Checkbox |
Sources: components/src/main/java/org/patternfly/component/button/Button.java82 components/src/main/java/org/patternfly/component/menu/MenuToggle.java72 components/src/main/java/org/patternfly/component/table/Table.java62
The PatternFly Java component foundation provides:
BaseComponent<E, B>: Generic base class with element management, CSS manipulation, ARIA support, and fluent APIComponentContext<E, B>: Key-value storage for attaching application data to componentsHasIdentifier<E, B>: Unique identification mechanism for component lookupthat() patternThis architecture enables:
Sources: components/src/main/java/org/patternfly/component/button/Button.java components/src/main/java/org/patternfly/component/menu/MenuToggle.java components/src/main/java/org/patternfly/component/table/Table.java components/src/main/java/org/patternfly/component/table/Tr.java components/src/main/java/org/patternfly/component/form/Checkbox.java components/src/main/java/org/patternfly/component/table/Cell.java
Refresh this wiki