yFiles for Java 3.2.0.3 Release Notes

The newest available bugfix and maintenance release of yFiles for Java is version 3.2.0.3.

Technical Requirements

  • To develop yFiles for Java 3.x-based applications, a Java 8 (or greater) Java Development Kit (JDK) is required.
  • To run yFiles for Java 3.x-based applications, a Java 8 (or greater) Java Runtime Environment (JRE) is required.

yFiles for Java (Swing) 3.2.0.3 – Changes Since 3.2.0.2

Bugfixes

Viewer

  • With SmartEdgeLabelModel, it was impossible to move a label from the left side of an edge to the right side. Instead, the label stopped at the edge.
  • Fixed an exception which could occur in CanvasComponent's method #compareRenderOrder and when using GraphModelManager's #Comparator property.
  • Parsing a GraphML file with a folding edge state with a label without a preferred size no longer throws an exception.
  • In rare cases, saving a graph with folding to GraphML threw an exception.
  • The NodeAlignmentPolicy values CENTER_LEFT, CENTER_RIGHT, TOP_CENTER, BOTTOM_CENTER, and BOTTOM_LEFT now work correctly.
  • Reparenting an expanded group node into a collapsed group node no longer throws an exception.
  • DefaultLabelStyle: Fixed insets calculation.

Layout

  • Fixed a potential exception in LayoutExecutor which could occur when a layout is applied to a graph which contains table nodes which are not group nodes.

yFiles for Java (Swing) 3.2.0.2 – Changes Since 3.2.0.1

New Demos

  • Added RotatableNodesDemo that shows how support for rotated node visualizations can be implemented on top of the yFiles library.
  • Added PartitionGridDemo that shows how a PartitionGrid can be used in layout calculations to restrict the node positions to grid cells.
  • Added RenderingOrderDemo that shows the effect of different render policies on the z-order of nodes, edges, labels and ports.
  • Added EdgeToEdgeDemo that demonstrates the use of edge-to-edge connections.

Improvements

Layout

  • Slightly improved the performance of the GenericLabeling algorithm and improved the quality of the label placements for some cases.

Bugfixes

View

  • Fixed null check for GridVisualCreator#Pen property.
  • Fixed an issue where EdgeStyleDecorationInstaller would cause an exception when used on edges that connect to other edges.
  • Fixed a bug, which might occur in very rare cases in the undo/redo processing of several consecutive reparent actions.
  • Fixed a bug in the graph implementation that sometimes led to a runtime that was quadratic in the number of nodes when creating large graphs.
  • CreateEdgeInputMode: Fixed a bug that caused the visualization of source port candidates to flicker.
  • The EdgeStyleDecorationsInstaller class now properly displays decorations for edges between group nodes and their descendants when displayed in view coordinates.
  • CollapsibleNodeStyleDecorator: Although the wrapped style has its own IClickListener defined in its lookup, it was not always used by the CollapsibleNodeStyleDecorator.
  • Fixed a bug in the UndoEngine that could lead to memory leaks if the tokens returned by getToken were not disposed of when the UndoEngine got cleared.
  • Fixed a bug that rendered labels or ports neither in a separate layer nor at their owner when exactly one of LabelLayerPolicy#AT_OWNER or PortLayerPolicy#AT_OWNER was used.
  • Fixed a bug in GridVisualCreator that rendered the grid at the wrong location when the viewport contained negative coordinates.
  • CollapsibleNodeStyleDecorator: IsHit respects buttons outside the node bounds.

Algorithms

  • Method Paths#findAllChains now correctly calculates the chains of input graphs with cycles.

Layout

  • Fixed a bug in class EdgeRouter that sometimes caused a non-deterministic behavior.
  • The PolylineLayoutStage does no longer generate overlaps between sloped, polyline segments created by the stage and unrelated other obstacles (e.g. nodes).
  • Fixed a rare exception that was triggered by the EdgeRouter class during routing in cases where the input contained grouped edges.
  • The GenericLabeling class now produces better results for edge labels that have a preferred distance to the edge (PreferredPlacementDescriptor#DistanceToEdge) and at the same time multiple SideOfEdge preferences (e.g. left of edge and on the edge). Previously, the algorithm sometimes violated the preferred distance even though it would have been possible to keep it.
  • Fixed two issues that induced the violation of a PortCandidate with fixed offsets (or a strong PortConstraint) by the EdgeRouter class. The first was only triggered for constraints at the target side and only when the target node was additionally partly or fully covered by other obstacles (e.g. node labels). The second issue appeared in cases with the source and target node fully overlapping (e.g. an edge from a group to a child node).
  • The EdgeRouter class no longer throws an exception for inputs (rare) containing fixed, grouped edges and when EdgeRouter#PolylineRoutingEnabled is enabled.
  • The EdgeRouter now considers the correct NodeHalo associated with the target node when handling the minimum last segment length setting. Previously it incorrectly considered the halo of the source node which could lead to unnecessarily long or too short last segments.
  • Class EdgeRouter now correctly considers intersections between edges and labels of fixed edges if property EdgeLabelConsiderationEnabled is enabled.
  • Fixed a very rare exception that was triggered by the EdgeRouter class during routing in cases where the source/target node is covered by obstacles (i.e. other nodes, labels).
  • The EdgeRouter class now correctly considers intermediate routing points when using the polyline routing style (EdgeRouter#PolylineRoutingEnabled). Previously, it could happen that intermediate points were not part of the final polyline edge path.
  • Class PartialLayout now correctly considers the specified PortCandidates during the orthogonal/octilinear routing of edges.
  • Class EdgeRouter no longer considers all PortCandidates with multiple directions as fixed PortCandidates.
  • The OrthogonalLayout class no longer throws an exception when property OrthogonalLayout#UniformPortAssignmentEnabled is enabled and the input contains parallel edges.
  • The CompactNodePlacer class now correctly considers the specified values of the VerticalDistance and HorizontalDistance properties.
  • Class OrganicRemoveOverlapsStage no longer produces infinite loops for some rare cases.
  • The CompactNodePlacer class no longer throws an exception for some inputs with specified strategy memento information (either via property TreeLayoutData#CompactNodePlacerStrategyMementos or with a mapper registered with key CompactNodePlacer#STRATEGY_MEMENTO_DPKEY).
  • Self-loop segments generated by the HierarchicLayout class are now shorter and take up less space if possible. Previously, segments were sometimes unnecessarily long even though the minimum length settings allowed shorter segments.
  • When using RecursiveGroupLayout, the values of the properties ComputedWidth, ComputedHeight and ComputedPosition of the classes ColumnDescriptor and RowDescriptor are now correctly set after the layout if EdgeRouter is the corresponding InterEdgeRouter.
  • The HierarchicLayout class now produces less superfluous crossings if there are same-layer edges with PortConstraints or PortCandidates.
  • Improved the path search performance of the EdgeRouter class for cases where a large number of fixed and overlapping edge segments exist. Previously, the search could become very slow in such scenarios.
  • The HierarchicLayout class now correctly handles port labels with zero height/width. Previously, such labels may have caused very large distances between some nodes.
  • The HierarchicLayout class sometimes threw an ArgumentException for input graphs that contained incremental elements in combination with groups.
  • The HierarchicLayout class now prevents intersections between labels and the horizontal grid lines of a PartitionGrid.
  • The EdgeRouter class no longer throws an exception for some inputs containing edges with intermediate routing points.
  • The HierarchicLayout class now places sloped segments of grouped octilinear edges such that they are perfectly overlapping each other. Previously, it could happen that segments were slightly displaced with respect to each other.
  • Class SeriesParallelLayout now correctly handles input graphs with groups that only contain disconnected nodes. Previously, such inputs caused an exception.
  • Fixed a bug in the HierarchicLayout that could cause non-orthogonal segments when the input contained port labels in conjunction with edge grouping.
  • The OrganicLayout class now produces deterministic results for group nodes (if property DeterministicModeEnabled is enabled).
  • Fixed a StackOverflowError in EdgeRouter.

yFiles for Java (Swing) 3.2.0.1 – Changes Since 3.2

Improvements

Styles

  • PolylineEdgeStyle and ArcEdgeStyle now consider property changes of their source and target arrows. Previously the source or target arrow properties had to be changed to instantly see the effect.

Layout

  • OrganicLayoutData: The new properties SourceGroupIds and TargetGroupIds can be used to group edges when some preconditions are met.

Bugfixes

Viewer

  • Scrolling with CanvasComponent#ScrollCommandAnimationEnabled enabled no longer changes the zoom level.
  • Fixed a bug in RectangleIndicatorInstaller, OrientedRectangleIndicatorInstaller, HandleInputMode and in SnapResultProvider and SnapResult implementations, that has caused a NullPointerException when the corresponding template is null.
  • DefaultLabelStyleRenderer: Fixed vanishing text when using a shared renderer instance between labels with non-empty text and label with empty text.

Input

  • PortDropInputMode: The labels of dragged ports were not displayed correctly.

Graph Model

  • Fixed an exception which might occur upon user interactions in a folded graph which contains labels at ports.
  • Fixed a bug which might have caused an edge in a folded view to lose its bends and labels after repeatedly reversing the edge.

Layout

  • HierarchicLayout: Fixed a problem that sometimes caused too long straight-line same-layer edges. Note that the additional length was equal to the value of HierarchicLayout#NodeToEdgeDistance
  • HierarchicLayout: Fixed endless loop issue causing a StackOverflowError if a sub-component with a nested layout algorithm that again applied an instance of HierarchicLayout was defined.
  • HierarchicLayout: Fixed possible NullPointerException for input graphs with source/target port labels (see LabelPlacements#AT_SOURCE_PORT and LabelPlacements.AT_TARGET_PORT) and with a subset of nodes associated with halos (see NodeHalo).
  • HierarchicLayout: Fixed a bug that sometimes caused a wrong placement of source/target edge labels when integrated edge labeling was enabled and if there were either critical edges (see HierarchicLayout.CRITICAL_EDGE_DPKEY) or property SimplexNodePlacer.EdgeStraighteningEnabled was enabled.
  • HierarchicLayout and SimplexNodePlacer: Fixed a very rare IllegalArgumentException that was caused by some input graphs that contain both swimlanes and groups as well as fixed elements.
  • HierarchicLayout: Fixed bug that could cause the violation of fixed port candidates if there were critical edges (see HierarchicLayout.CRITICAL_EDGE_DPKEY) and edges connecting to group nodes.
  • OrganicLayout: Fixed bug that caused that movable nodes kept their initial location if the scope is set to SUBSET or MAINLY_SUBSET and if there are output restrictions (see OrganicLayout#OutputRestriction).
  • TreeLayout: Fixed bug that caused less compact results when using the CompactNodePlacer.
  • TreeLayout: Fixed bug that caused that the layout algorithm sometimes did not pass on exceptions that occurred during the layout calculation but caught them without proper handling.
  • CompactNodePlacer: Fixed NullPointerException that was triggered when the tree root was marked as assistant node, see AssistantNodePlacer#ASSISTANT_DPKEY.
  • CompactNodePlacer: Fixed IllegalStateException that could occur for input graphs that contain assistant nodes (see AssistantNodePlacer#ASSISTANT_DPKEY) and given placement strategies (see CompactNodePlacer#STRATEGY_MEMENTO_DPKEY).
  • OrthogonalLayout: Fixed NullPointerException that occurred when the subtree layout style TreeLayoutStyle#INTEGRATED was specified, the subtree orientation was fixed and the graph was almost a tree graph with the exception that the root node contained additional self-loop edges.
  • SeriesParallelLayout: Fixed a rare bug that triggered a NullPointerException when the input location of a node was set to a very large value (e.g. largest possible floating-point value). This applies if the algorithm is not in from-sketch mode. For the from-sketch mode, an exception can still occur - this case is considered to be bad input.
  • RadialLayout: Fixed NullPointerException that was triggered when there was a DataProvider registered with the graph with key HierarchicalLayout.SUB_COMPONENT_ID_DPKEY.
  • ComponentLayout: Fixed an IllegalArgumentException that was triggered for some input graphs with user-defined components (see COMPONENT_ID_DPKEY) where at least one node had null as its component id.
  • RecursiveGroupLayout: Fixed a bug that caused violation of PortConstraints or PortCandidates for self-loops where both endpoints were restricted to the same node side.
  • Polyline.EdgeRouter: Fixed a rare NullPointerException that was triggered for some input graphs when the maximum duration was exceeded.
  • Polyline.EdgeRouter: Fixed bug that could cause unnecessary bends for edges that need to cross group node borders.
  • Polyline.EdgeRouter: Fixed an issue that caused edge-to-edge distance violations (for segments directly connecting at a node) even if a cheaper route that e.g., introduces a bend - which costs less by default - was available.
  • PolylineLayoutStage: Fixed a bug that caused collinear bends to be removed from fixed edges. Now, such fixed edges are not changed anymore.
  • GenericLabeling: Fixed a very rare IllegalArgumentException that was caused by some input graphs that contain edges with zero length segments and labels associated with a free edge label model (i.e., SmartEdgeLabelModel or FreeEdgeLabelModel).