yFiles for Java 2.x Release Notes
yFiles for Java version 2.13 is the newest major release available in the yFiles for Java 2.x technology line.
It contains many exciting new features compared to older versions and is almost completely API compatible with the 2.12 series.
(See also the entire yFiles for Java change log.)
- Oracle J2SDK 1.4 or higher is needed for software development with yFiles.
- Oracle J2RE 1.4 or higher is needed to execute programs using yFiles.
- A browser to view the HTML documentation.
yFiles 2.13 - Changes Since 188.8.131.52
Major Features Added
- IncrementalHierarchicLayouter supports recursively routed edges. Edges that pass the border of group nodes will always leave at the bottom side and enter at the top side of the group node. This routing style is specified using setRecursiveEdgeStyle.
- IncrementalHierarchicLayouter: Improved from-sketch behavior for groups with changed bounds (e.g. after folding or expanding a group node), see IncrementalHierarchicFoldExpandDemo.
- Added edge bundling feature. Bundling together multiple edges means that their common parts are to some degree merged into a bundled part. Edge bundling is useful to increase the readability of graph drawings with a high number of edges that connect a comparably small number of nodes. The following layout algorithms support edge bundling:
Minor Features Added
- IncrementalHierarchicLayouter: Added support for sequence constraints between edges as well as nodes and edges, see SequenceConstraintFactory.
- IncrementalHierarchicLayouter: Added support for overlapping layers. The strict layer structure can be compacted by moving layers up into the space of previous layers. Layers are only moved if it won't produce overlaps with nodes or edges.
- IncrementalHierarchicLayouter: Added feature that allows for edges that connect group nodes with their descendants to directly connect from inside to the group node's border. It can be activated for each edge individually on the EdgeLayoutDescriptor by calling setDirectGroupContentEdgeRoutingEnabled.
- RecursiveGroupLayouter: Added edge splitting for inter-edges and the possibility to align edges that connect to the group border from inside and outside.
- SALabeling and GreedyMISLabeling: Added option setAmbiguityReductionEnabled that reduces the ambiguity of label placements. When enabled, the labeling algorithms try to avoid placing labels at positions where it is not clear to which graph element a label belongs.
- Added layout stage CurveFittingLayoutStage which allows the approximation of edge paths with cubic bezier curve control points. The stage is especially useful if curved edges are modeled using a large number of bends connected via straight lines.
- Groups: Added k-means clustering algorithm that partitions a given graph in k-clusters.
- Groups: Added hierarchical clustering algorithm that partitions a given graph based on agglomerative (i.e., bottom-up) strategy and some linkage function (single-, complete- and average-linkage).
- IncrementalHierarchicLayouter: Added properties that allow for stopping the layout algorithm after the layering or the sequencing phase while skipping the subsequent phases. This may be useful when using two layout runs to collect layering and/or sequencing information in the first run that will be used during the second run.
- IncrementalHierarchicLayouter: Fixed edges which have segments that should be horizontal or vertical but are slightly non-orthogonal.
- IncrementalHierarchicLayouter: Improved behavior in incremental mode that moved normal nodes that were in different layers (in the initial layout) to the same layer. This behavior occurred in case there were group nodes that extended into the layer above or below to get a compact result.
- EdgeRouter will now consider the target group of an edge if this edge is the only member of its source group.
- EdgeRouter: Improved edge routes of self-loops to go around at least one corner of the node. Only if both source and target port are restricted to the same side (PortConstraint, PortCandidate), self-loops may start and end at the same side of the node.
- InteractiveOrganicLayouter: Fixed possible performance problem after changing the inertia/stress of some nodes.
- DirectedOrthogonalLayouter: Now always produces planar drawings for trees.
- SALabeling and GreedyMISLabeling: Generic labeling algorithms do not consider any more labels of zero width or height. Before, bad labeling results were possible especially when using zero-sized labels with SALabeling.
- SALabeling and GreedyMISLabeling: Improved performance - especially for large graph instances.
- Improved support for PreferredPlacementDescriptor side preference (left, on-edge, right) when using generic labeling algorithms SALabeling and GreedyMISLabeling. Now, the side preference is considered for edge labels with arbitrary EdgeLabelModel implementations.
- GenericTreeLayouter: Improved DefaultPortAssignment to consider PortConstraints in all modes. If a distributed mode is selected then weak constraints will also be distributed on the according side.
- LayeredNodePlacer: Improved spacing between labels and bends when polyline labeling is enabled.
- RadialLayouter: If the data provider registered with key NODE_INFO_DPKEY also implements DataAcceptor interface, it will be filled with the according RadialLayouter.NodeInfo object for each node.
- Added layout stage HandleNaNCoordinatesStage which prevents layout algorithms that take initial
coordinates for nodes and edges into account from failing if some of those graph elements have
- Several smaller runtime improvements for the following layout algorithms:
- ItemEditor: Added support for alternative font families in editors of text/string based option items with new attribute ATTRIBUTE_FONT_NAME.
- Graph2DPrinter: Added protected method printGraph for easier customization.
- GraphML: Added methods
writeIconAttributeto classes EdgeLabelDeserializer, NodeLabelDeserializer, EdgeLabelSerializer, and NodeLabelSerializer respectively for easier customization of icon (de-)serialization.
- Added Curve Fitting Demo demonstrating possible usages of CurveFittingLayoutStage that fits piecewise cubic bezier curves to given arbitrary edge paths.
- IncrementalHierarchicLayouter: Fixed bug that resulted in edges whose segments are not on grid.
- IncrementalHierarchicLayouter: Fixed grid references to place the nodes on grid correctly for each layout orientation.
- IncrementalHierarchicLayouter: Fixed bug that caused grouped edge segments to overlap with one of the adjacent nodes if it is a group node.
- IncrementalHierarchicLayouter: Fixed bug that caused same layer segments to be too short for the labels that should be placed at those segments.
- IncrementalHierarchicLayouter: Fixed bug that caused a violation of minimum first/last segment length for edges that connect two neighboring nodes in the same layer.
- IncrementalHierarchicLayouter: Fixed bug that caused a violation of minimum first/last segment length for edges that connect to group nodes. Now, the first/last segments of those edges will have at least the length of the largest minimum first/last segment length of all edges connected to the same group node.
- IncrementalHierarchicLayouter: Fixed rare
IllegalStateExceptionthat is caused by an inconsistent group node order that may appear for input graphs containing both swimlanes and groups.
- IncrementalHierarchicLayouter: Fixed bug with some ignored any side strong port constraints.
- IncrementalHierarchicLayouter: Fixed bug that caused PortCandidates to potentially be ignored or not handled correctly for self-loops when having directions other than NORTH, SOUTH, WEST or EAST.
- EdgeRouter: Fixed bug that caused edges routed by the EdgeRouter to sometimes share the same port with edges defined as fixed.
- EdgeRouter: Fixed bug that caused violations of the node to edge distance between an edge and its target if the edge approaches the target from the opposite side of the target port constraint.
- EdgeRouter: Fixed bug that caused incorrect routes for grouped edges with intersecting source and target.
- EdgeRouter: Fixed rare
NullPointerExceptionthat may appear during rerouting of edges (see setReroutingEnabled) if the input graph contains overlapping nodes.
- EdgeRouter: Fixed possible
NullPointerExceptionthat may appear if there are grouped edges consisting of both fixed and non-fixed edges (see setSphereOfAction).
- EdgeRouter: Fixed bug that may cause that some edges are not considered during rerouting. It only appears if the graph contains grouped edges.
- EdgeRouter: Fixed rare bug that may cause a
- ChannelEdgeRouter: Fixed bug that may cause segments with infinite coordinates for edges incident to group nodes if the path finder strategy is set to ChannelEdgeRouter.OrthogonalShortestPathPathFinder.
- GreedyMISLabeling and SALabeling: Improved placement of edge labels with preferred placement at source/target if the label model is SmartEdgeLabelModel or FreeEdgeLabelModel.
- GreedyMISLabeling and SALabeling: Fixed bug that may cause that the postprocessing step (see option setApplyPostprocessing) ignores some node labels with model FreeNodeLabelModel.
- DirectedOrthogonalLayouter: Fixed problem that may cause non-directed routes for directed edges if option setAlignDegreeOneNodesEnabled is enabled.
- MultiPageLayouter: Fixed possible
NullPointerExceptionthat may appear if an internal layouter queries a DataProvider for an inserted dummy node.
- CircularLayouter: Fixed a bug that could potentially cause an infinite loop when encountering a node with a very high out-degree.
- CircularLayouter: Fixed bug that caused nodes to be placed outside of the enclosing circle when using layout style SINGLE_CYCLE and partition layout style PARTITION_LAYOUTSTYLE_ORGANIC.
- ParallelEdgeLayouter: Fixed possible
NullPointerExceptionthat may appear if the parallel edge is almost horizontal/vertical.
- PortCandidateAssignmentStage: Fixed bug that caused the location of strong port constraints to be ignored when using this stage together with a layout algorithm that cannot handle port constraints.
- RemoveColinearBendsStage: Now coincident bend points can also be removed since they produced edge segments of very small length and, thus, in some layout algorithms caused label placement failures.
- FamilyTreeLayouter: Fixed handling of grouping DataProviders so they are not changed by the layout algorithm.
- FamilyTreeLayouter: Fixed possible
NullPointerExceptionthat may appear if the input graph contains group nodes.
- BusRouterModule now hides fixed non-orthogonal edges when scope 'Reroute to Selected Nodes' is selected, fixing a bug that caused an Exception because BusRouter can only handle fixed edges that are orthogonal.
- TableEditorFactory: Method resetEditor now properly
removes the editor from its previous option handler and properly adds
the editor to the new option handler. As a result resetEditor now also triggers
- Fixed incorrect sloppy edge painting when using VALUE_SLOPPY_POLYLINE_PAINTING_OFF. The incorrect sloppy edge painting is noticeable when animating edge path changes.
NullPointerExceptionin TableOrderEditor and TableSizeEditor that may occur if label editing is started while changing the order or size of table columns or rows.
- GML and XGML: Improved serialization of obfuscated user data and style property types for GenericNodeRealizer and GenericEdgeRealizer as well as obfuscated user data types of YLabel.
- GraphML: Fixed
NullPointerExceptionthat occurred if a YModule instance without an associated OptionHandler instance was used as post-processor.
- GraphML: Fixed GraphML serialization for YLabel properties
- GroupNodeRealizerSerializer: GroupNodeRealizer's
autoResizeproperty is now stored as part of
- FamilyTreeDemo: Fixed problem that may cause displacement of graph elements when clicking on a node.
- The following constructors have been removed:
- FixedGroupLayoutStage: Method
getInterEdgeroutingStyle()has been renamed to getInterEdgeRoutingStyle.
- EdgeReverser: Method reverseEdges has become static.
- The following classes, constructors, and methods have been deprecated:
- PortConstraint: All constructors
- PortCandidate: All constructors
- SimplexDrawer: Method getCost
- SequenceConstraintFactory: Methods
- WeightedLayerer: Method downShiftNodes
- Class PartialLayouter.StraightLineEdgeRouter
- The following default values of properties have been changed:
- CanonicMultiStageLayouter and MultiPageLayouter:
LabelLayouteris now set to an instance of SALabeling.
- OrthogonalEdgeRouter: Default value of property
The OrthogonalShortestPathPathFinder which is used as default
path finder strategy now uses value
1.5as default for property
- PartialLayouter: Default value of property
- MultiParentDescriptor: Default value of property
- BalloonLayouter: Default value of property
- SALabeling: Default value of property
- SplitEdgeLayoutStage: Default value of property
- CanonicMultiStageLayouter and MultiPageLayouter: The default
- IncrementalHierarchicLayouter: For input graphs with infeasible PortConstraints and PortCandidates/PortCandidateSets (i.e., for edges that have non-matching port constraints/candidates), the layout algorithm now always prefers PortConstraints. In previous versions, the behaviour was not well-defined for such cases.
- CompositeLayoutStage: Method canLayout now checks if all the LayoutStages of the pipeline
can layout the given graph and does not return always
- SingleCycleLayouter: Method canLayoutCore now returns
nullis given as input.
- PortCandidateAssignmentStage: Now, if an edge has registered PortCandidates and connects to nodes with PortCandidateSets, the stage will try to match both collections to find an appropriate port. In case there is no matching port candidate, a PortCandidate specified for the edge is preferred. Before, one of PortCandidates was selected without trying to match with node port candidates.
- GraphTransformer: Method setOperation now only sets the operation value and does not disable the automatic selection of best fitting rotation angle if an operation other than ROTATE is selected.
- Centrality: The following methods can now take empty NodeMaps and EdgeMaps as arguments for returning the resulting centrality values.
- Most of the setter methods of the properties of package
y.layoutnow throw an
IllegalArgumentExceptionif an unexpected/illegal or
nullargument is given as input.
- The following methods/constructors now throw
IllegalArgumentExceptions instead of
- DelegatingNodePlacer: Method determineChildConnector now throws an
IllegalStateExceptioninstead of an
- OrthogonalLayouter: Method setIntegratedEdgeLabelingEnabled throws an
IllegalStateExceptionif the current label layouter is not of type LabelLayoutTranslator.
- TreeComponentLayouter: Constructor TreeComponentLayouter throws an
nullis given as argument.