Class VFXDefaultTableRow<T>
- All Implemented Interfaces:
io.github.palexdev.mfxcore.controls.MFXStyleable,VFXCell<T>,Styleable,EventTarget
VFXTableRow. Nothing special here, just the default implementations
of the abstract core APIs.-
Property Summary
Properties inherited from class io.github.palexdev.virtualizedfx.table.VFXTableRow
index, itemProperties inherited from class javafx.scene.layout.Region
background, border, cacheShape, centerShape, height, insets, maxHeight, maxWidth, minHeight, minWidth, opaqueInsets, padding, prefHeight, prefWidth, scaleShape, shape, snapToPixel, widthProperties inherited from class javafx.scene.Parent
needsLayoutProperties inherited from class javafx.scene.Node
accessibleHelp, accessibleRoleDescription, accessibleRole, accessibleText, blendMode, boundsInLocal, boundsInParent, cacheHint, cache, clip, cursor, depthTest, disabled, disable, effectiveNodeOrientation, effect, eventDispatcher, focused, focusTraversable, focusVisible, focusWithin, hover, id, inputMethodRequests, layoutBounds, layoutX, layoutY, localToParentTransform, localToSceneTransform, managed, mouseTransparent, nodeOrientation, onContextMenuRequested, onDragDetected, onDragDone, onDragDropped, onDragEntered, onDragExited, onDragOver, onInputMethodTextChanged, onKeyPressed, onKeyReleased, onKeyTyped, onMouseClicked, onMouseDragEntered, onMouseDragExited, onMouseDragged, onMouseDragOver, onMouseDragReleased, onMouseEntered, onMouseExited, onMouseMoved, onMousePressed, onMouseReleased, onRotate, onRotationFinished, onRotationStarted, onScrollFinished, onScroll, onScrollStarted, onSwipeDown, onSwipeLeft, onSwipeRight, onSwipeUp, onTouchMoved, onTouchPressed, onTouchReleased, onTouchStationary, onZoomFinished, onZoom, onZoomStarted, opacity, parent, pickOnBounds, pressed, rotate, rotationAxis, scaleX, scaleY, scaleZ, scene, style, translateX, translateY, translateZ, viewOrder, visible -
Field Summary
Fields inherited from class io.github.palexdev.virtualizedfx.table.VFXTableRow
cells, columnsRangeFields inherited from class javafx.scene.layout.Region
USE_COMPUTED_SIZE, USE_PREF_SIZEFields inherited from class javafx.scene.Node
BASELINE_OFFSET_SAME_AS_HEIGHT -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprotected doublegetWidthOf(VFXTableColumn<T, ?> column, boolean forceLayout) This method should be responsible for computing the ideal width of a cell given the corresponding column so that its content can be fully shown.protected booleanreplaceCells(VFXTableColumn<T, VFXTableCell<T>> column) This method mainly exists to react to cell factory changes.protected voidupdateColumns(io.github.palexdev.mfxcore.base.beans.range.IntegerRange columnsRange, boolean columnsChanged) Implementations of this method should mainly react to two types of change in the table:voidupdateItem(T item) Responsible for both updating the row's item property and all of its cells' item property.Methods inherited from class io.github.palexdev.virtualizedfx.table.VFXTableRow
clear, copyState, defaultStyleClasses, dispose, getCell, getCells, getCellsAsNodes, getCellsByIndex, getCellsUnmodifiable, getColumnsRange, getIndex, getItem, getTable, indexProperty, itemProperty, layoutCells, layoutChildren, onCellsChanged, onCreated, saveAllCells, saveCell, setIndex, setItem, toNode, updateIndexMethods inherited from class javafx.scene.layout.Region
backgroundProperty, borderProperty, cacheShapeProperty, centerShapeProperty, computeMaxHeight, computeMaxWidth, computeMinHeight, computeMinWidth, computePrefHeight, computePrefWidth, getBackground, getBorder, getClassCssMetaData, getCssMetaData, getHeight, getInsets, getMaxHeight, getMaxWidth, getMinHeight, getMinWidth, getOpaqueInsets, getPadding, getPrefHeight, getPrefWidth, getShape, getUserAgentStylesheet, getWidth, heightProperty, insetsProperty, isCacheShape, isCenterShape, isResizable, isScaleShape, isSnapToPixel, layoutInArea, layoutInArea, layoutInArea, layoutInArea, maxHeight, maxHeightProperty, maxWidth, maxWidthProperty, minHeight, minHeightProperty, minWidth, minWidthProperty, opaqueInsetsProperty, paddingProperty, positionInArea, positionInArea, prefHeight, prefHeightProperty, prefWidth, prefWidthProperty, resize, scaleShapeProperty, setBackground, setBorder, setCacheShape, setCenterShape, setHeight, setMaxHeight, setMaxSize, setMaxWidth, setMinHeight, setMinSize, setMinWidth, setOpaqueInsets, setPadding, setPrefHeight, setPrefSize, setPrefWidth, setScaleShape, setShape, setSnapToPixel, setWidth, shapeProperty, snappedBottomInset, snappedLeftInset, snappedRightInset, snappedTopInset, snapPosition, snapPositionX, snapPositionY, snapSize, snapSizeX, snapSizeY, snapSpace, snapSpaceX, snapSpaceY, snapToPixelProperty, widthPropertyMethods inherited from class javafx.scene.Parent
getBaselineOffset, getChildren, getChildrenUnmodifiable, getManagedChildren, getStylesheets, isNeedsLayout, layout, lookup, needsLayoutProperty, queryAccessibleAttribute, requestLayout, requestParentLayout, setNeedsLayout, updateBoundsMethods inherited from class javafx.scene.Node
accessibleHelpProperty, accessibleRoleDescriptionProperty, accessibleRoleProperty, accessibleTextProperty, addEventFilter, addEventHandler, applyCss, autosize, blendModeProperty, boundsInLocalProperty, boundsInParentProperty, buildEventDispatchChain, cacheHintProperty, cacheProperty, clipProperty, computeAreaInScreen, contains, contains, cursorProperty, depthTestProperty, disabledProperty, disableProperty, effectiveNodeOrientationProperty, effectProperty, eventDispatcherProperty, executeAccessibleAction, fireEvent, focusedProperty, focusTraversableProperty, focusVisibleProperty, focusWithinProperty, getAccessibleHelp, getAccessibleRole, getAccessibleRoleDescription, getAccessibleText, getBlendMode, getBoundsInLocal, getBoundsInParent, getCacheHint, getClip, getContentBias, getCursor, getDepthTest, getEffect, getEffectiveNodeOrientation, getEventDispatcher, getId, getInitialCursor, getInitialFocusTraversable, getInputMethodRequests, getLayoutBounds, getLayoutX, getLayoutY, getLocalToParentTransform, getLocalToSceneTransform, getNodeOrientation, getOnContextMenuRequested, getOnDragDetected, getOnDragDone, getOnDragDropped, getOnDragEntered, getOnDragExited, getOnDragOver, getOnInputMethodTextChanged, getOnKeyPressed, getOnKeyReleased, getOnKeyTyped, getOnMouseClicked, getOnMouseDragEntered, getOnMouseDragExited, getOnMouseDragged, getOnMouseDragOver, getOnMouseDragReleased, getOnMouseEntered, getOnMouseExited, getOnMouseMoved, getOnMousePressed, getOnMouseReleased, getOnRotate, getOnRotationFinished, getOnRotationStarted, getOnScroll, getOnScrollFinished, getOnScrollStarted, getOnSwipeDown, getOnSwipeLeft, getOnSwipeRight, getOnSwipeUp, getOnTouchMoved, getOnTouchPressed, getOnTouchReleased, getOnTouchStationary, getOnZoom, getOnZoomFinished, getOnZoomStarted, getOpacity, getParent, getProperties, getPseudoClassStates, getRotate, getRotationAxis, getScaleX, getScaleY, getScaleZ, getScene, getStyle, getStyleableParent, getStyleClass, getTransforms, getTranslateX, getTranslateY, getTranslateZ, getTypeSelector, getUserData, getViewOrder, hasProperties, hoverProperty, idProperty, inputMethodRequestsProperty, intersects, intersects, isCache, isDisable, isDisabled, isFocused, isFocusTraversable, isFocusVisible, isFocusWithin, isHover, isManaged, isMouseTransparent, isPickOnBounds, isPressed, isVisible, layoutBoundsProperty, layoutXProperty, layoutYProperty, localToParent, localToParent, localToParent, localToParent, localToParent, localToParentTransformProperty, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToScene, localToSceneTransformProperty, localToScreen, localToScreen, localToScreen, localToScreen, localToScreen, lookupAll, managedProperty, mouseTransparentProperty, nodeOrientationProperty, notifyAccessibleAttributeChanged, onContextMenuRequestedProperty, onDragDetectedProperty, onDragDoneProperty, onDragDroppedProperty, onDragEnteredProperty, onDragExitedProperty, onDragOverProperty, onInputMethodTextChangedProperty, onKeyPressedProperty, onKeyReleasedProperty, onKeyTypedProperty, onMouseClickedProperty, onMouseDragEnteredProperty, onMouseDragExitedProperty, onMouseDraggedProperty, onMouseDragOverProperty, onMouseDragReleasedProperty, onMouseEnteredProperty, onMouseExitedProperty, onMouseMovedProperty, onMousePressedProperty, onMouseReleasedProperty, onRotateProperty, onRotationFinishedProperty, onRotationStartedProperty, onScrollFinishedProperty, onScrollProperty, onScrollStartedProperty, onSwipeDownProperty, onSwipeLeftProperty, onSwipeRightProperty, onSwipeUpProperty, onTouchMovedProperty, onTouchPressedProperty, onTouchReleasedProperty, onTouchStationaryProperty, onZoomFinishedProperty, onZoomProperty, onZoomStartedProperty, opacityProperty, parentProperty, parentToLocal, parentToLocal, parentToLocal, parentToLocal, parentToLocal, pickOnBoundsProperty, pressedProperty, pseudoClassStateChanged, relocate, removeEventFilter, removeEventHandler, requestFocus, requestFocusTraversal, resizeRelocate, rotateProperty, rotationAxisProperty, scaleXProperty, scaleYProperty, scaleZProperty, sceneProperty, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, sceneToLocal, screenToLocal, screenToLocal, screenToLocal, setAccessibleHelp, setAccessibleRole, setAccessibleRoleDescription, setAccessibleText, setBlendMode, setCache, setCacheHint, setClip, setCursor, setDepthTest, setDisable, setDisabled, setEffect, setEventDispatcher, setEventHandler, setFocused, setFocusTraversable, setHover, setId, setInputMethodRequests, setLayoutX, setLayoutY, setManaged, setMouseTransparent, setNodeOrientation, setOnContextMenuRequested, setOnDragDetected, setOnDragDone, setOnDragDropped, setOnDragEntered, setOnDragExited, setOnDragOver, setOnInputMethodTextChanged, setOnKeyPressed, setOnKeyReleased, setOnKeyTyped, setOnMouseClicked, setOnMouseDragEntered, setOnMouseDragExited, setOnMouseDragged, setOnMouseDragOver, setOnMouseDragReleased, setOnMouseEntered, setOnMouseExited, setOnMouseMoved, setOnMousePressed, setOnMouseReleased, setOnRotate, setOnRotationFinished, setOnRotationStarted, setOnScroll, setOnScrollFinished, setOnScrollStarted, setOnSwipeDown, setOnSwipeLeft, setOnSwipeRight, setOnSwipeUp, setOnTouchMoved, setOnTouchPressed, setOnTouchReleased, setOnTouchStationary, setOnZoom, setOnZoomFinished, setOnZoomStarted, setOpacity, setPickOnBounds, setPressed, setRotate, setRotationAxis, setScaleX, setScaleY, setScaleZ, setStyle, setTranslateX, setTranslateY, setTranslateZ, setUserData, setViewOrder, setVisible, snapshot, snapshot, startDragAndDrop, startFullDrag, styleProperty, toBack, toFront, toString, translateXProperty, translateYProperty, translateZProperty, usesMirroring, viewOrderProperty, visiblePropertyMethods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, waitMethods inherited from interface io.github.palexdev.mfxcore.controls.MFXStyleable
defaultStyleClassesMethods inherited from interface javafx.css.Styleable
getStyleableNodeMethods inherited from interface io.github.palexdev.virtualizedfx.cells.base.VFXCell
afterLayout, beforeLayout, onCache, onDeCache
-
Constructor Details
-
VFXDefaultTableRow
-
-
Method Details
-
updateColumns
protected void updateColumns(io.github.palexdev.mfxcore.base.beans.range.IntegerRange columnsRange, boolean columnsChanged) Implementations of this method should mainly react to two types of change in the table:1) the visible columns changes, or more in general the state's columns range changes
2) changes in the columns' list that may not necessarily change the range. In particular, this type of change is distinguished by the 'change' parameter set to true. In this case, the row's state should always be computed as there is no information on how the list changed, a 'better safe than sorry' approach.
First and foremost, the algorithm will run only if: the given columns range is different from the current one, or if thecolumnsChangedflag is true (which means that the table's columns' list has changed).The computation for the new row's state is simple. First we create a new state map which is going to replace the current one, considered now as 'old'. For each column (index) in the new range, we attempt at removing the corresponding cell from the old map. Beware! The removal is done by column not index because the list changed and now columns may be at different positions!!
If the retrieved cell is not
null, then it means that the column is still present in the viewport and thus we can reuse its cell. We update the cell's index (only ifcolumnsChangedis true), then put it in the new state map and continue to the next index.If the cell is
nullthen it means that the column is not visible anymore (either because by scrolling is now outside the new range, or because it was removed). In this case we request a new cell from the column at which the loop is by callingVFXTableRow.getCell(int, VFXTableColumn, boolean)(we use the cache if possible) and put it in the new state map.At the end of the loop, this invokes
VFXTableRow.saveAllCells()to cache all the remaining cells in the old map, then replace it with the new built map, update the columns range and if any cell has changed this also callsVFXTableRow.onCellsChanged().- Specified by:
updateColumnsin classVFXTableRow<T>
-
replaceCells
This method mainly exists to react to cell factory changes. When a column changes its factory, there is no need to re-compute each rows' state, rather we can just replace the cells for that column with new ones. Implementations should have a proper algorithm for the sake of performance. Before detailing the internals, there is a special property of the row's state map that should be mentioned. Maps of such type (IndexBiMap) must deal with duplicates and for this reason they store the 'reverse mappings' in a collection. However, theIndexBiMap.RowsStateMapis a special case. You see, every cell is associated with one unique column index, but it's also true that every cell is also associated with one and one only column (the one that built it). So, the collection will contain at most one single element.First we remove the cells from the map by the given column using
IndexBiMap.remove(Object). If it is notnullthen we cache it withVFXTableRow.saveCell(VFXTableColumn, VFXTableCell), and remove it from the children list.As for the new cell, we request a new one by calling
VFXTableRow.getCell(int, VFXTableColumn, boolean)(we don't use the cache as the cells stored in it may be invalid if the cell factory changed). The cell is added to the state map, to the children list and finally sized and positioned by callingVFXTableHelper.layoutCell(int, VFXTableCell).Note that to get a new cell, and to lay out it, we need two different indexes. The index of the column is retrieved by using
VFXTable.indexOf(VFXTableColumn)and it's needed to update the cell. The other index is an important piece information for the layout method to decide at which x position to put the cell. This index is also called the 'layout index' depends on theColumnsLayoutModeand its 'absolute'. For theFIXEDmode it is given bycolumnIndex - columnsRange.getMin(), while for theVARIABLEmode is the column's index itself (since all columns are added to the viewport, layout indexes go from 0 to the number of column).- Specified by:
replaceCellsin classVFXTableRow<T>- Returns:
- whether the substitution was done successfully
-
getWidthOf
This method should be responsible for computing the ideal width of a cell given the corresponding column so that its content can be fully shown. This is important for the table's autosize feature to work properly! Extract a cell from the state map by the given column usingIndexBiMap.RowsStateMap.getSingle(VFXTableColumn). If the cell is notnullcomputes its width by callingNode.prefWidth(double). Before doing so, if theforceLayoutflag is true, also callsNode.applyCss().If the width can't be computed or if anything goes wrong, returns -1.0.
- Specified by:
getWidthOfin classVFXTableRow<T>- Parameters:
forceLayout- it may happen that this garbage that is JavaFX to still have an incomplete scene graph, meaning for example that skins are not still available for some controls/cells, which means that we could fail in computing any size. This may happen even if the table's layout has been already computed at least once. Internal checks try to identify such occasions and may pass 'true' to this method. What implementations could do to get a correct value is to force the cells to compute their layout (as well as all of their children) by invokingNode.applyCss(). Note, however, that this is going to be a costly operation at init, but it's pretty much the only way.
-
updateItem
Responsible for both updating the row's item property and all of its cells' item property.- Specified by:
updateItemin interfaceVFXCell<T>- Overrides:
updateItemin classVFXTableRow<T>
-