Prajna provides a variety of visualization classes. Using these classes, developers can create complex visualizations. The visualization classes are grouped into several different functional areas. These areas are the Displays, Renderers, and Arrangements.
The design of the visualization classes uses interfaces extensively. Because of this, a developer may easily change the arrangement or the renderer used for a particular display. Prajna strives for a very modular approach to building visualization applications. In addition, the visualization classes are data-agnostic, and can be used with any type of data. This allows a developer to use these visualization classes with any set of objects which represent a set of data.
The various visualization display classes are typically designed to work with one the various Prajna data structures. Rather than try to create a display that renders all of the various data structures, Prajna instead offers display components for displaying particular structures well. Most of these display components extend the Java Swing components, and may be easily added to applications. Most of the display components also provide the ability to query different items on the display.
For graphs, Prajna includes a GraphDisplay interface, and an AbstractGraphDisplay class. Concrete implementations include the GraphCanvas which provides all basic graph display functionality, and displays graphs in a familiar node-link diagram. The AnimateCanvas extends GraphCanvas, adding animation support. The MatrixGraphDisplay is a different graph display type, showing the graph data in a matrix which shows the nodes as rows and columns, and shows edges at the grid coordinates.
Prajna provides the TreeDisplay interface for displaying trees. The JTreeWrapper class displays the tree data in a JTree component. The FillTreePane is a simple class using a hierarchy of rectangular regions to represent the tree. The TreeGraphCanvas class treats the tree like a graph, and uses the various graph display techniques.
Prajna provides the AbstractDatasetDisplay interface for datasets, though no concrete classes have been developed yet. Support for Grid displays is still in development.
Prajna also provides a TimeLineCanvas class for rendering temporal data. This class can be used to render time sequences and spans.
Prajna uses Renderers to determine how a particular element should be displayed. A NodeRenderer provides the representation for a particular element within one of the data structures. An EdgeRenderer is used specifically to render edges of a Graph. Prajna provides numerous renderers, and the implementations of most of the Renderers provide considerable extensibility.
Typically, a visualization display will use a particular NodeRenderer. Graphs will also use an EdgeRenderer if the edges are to be displayed. Since the Renderer classes provide extension points, a developer can easily design a custom renderer for a particular collection of data.
No generalized rendering technique would be able to provide a renderer which can display the data for a particular application. Therefore, Prajna renderers offer basic capability and easy extensibility. Since the renderers work on objects, a developer can easily build a renderer which renders a particular object - or several different classes of objects - based upon a particular need. Developers can even use the ClassNodeRenderer class, which renders different objects with different renderers, depending on their class.
Displaying a node-based display of a graph or a hierarchical tree involves determining where the components of a graph or tree are to be located in the display area. Prajna uses the GraphArrangement and TreeArrangement interfaces for this task. Prajna supplies a number of arrangement algorithms with different characteristics.
Again, developers are encouraged to develop custom arrangements for particular applications. Though the Prajna arrangements provide a sampling of arrangement techniques, they are far from exhaustive.