I want to display a tree in a Java GUI, but I dont know how. The tree represents a graph of connected nodes, like this:

I should say that I have my own tree class:
public class BinaryTree { private BinaryNode root; public BinaryTree( ) { root = null; } public BinaryTree( Object rootItem ) { root = new BinaryNode( rootItem, null, null ); } public BinaryTree( Object rootItem,BinaryNode a,BinaryNode b ) { root = new BinaryNode( rootItem, a, b ); } public int leavesCount(){ return BinaryNode.leavesCount(root); } public boolean equal(BinaryTree a,BinaryTree b){ return BinaryNode.equal(a.root, b.root); } public void printPreOrder( ) { if( root != null ) root.printPreOrder( ); } public void printInOrder( ) { if( root != null ) root.printInOrder( ); } public void printPostOrder( ) { if( root != null ) root.printPostOrder( ); } public void makeEmpty( ) { root = null; } public boolean isEmpty( ) { return root == null; } public void merge( Object rootItem, BinaryTree t1, BinaryTree t2 ) throws MergeAbrot { if( t1.root == t2.root && t1.root != null ) { throw new MergeAbrot("MergeAbrot"); } root=new BinaryNode( rootItem, t1.root, t2.root ); if( this != t1 ) t1.root = null; if( this != t2 ) t2.root = null; } public int size( ) { return BinaryNode.size( root ); } public int height( ) { return BinaryNode.height( root ); } }
I only want to draw the tree. How should I do?
The simplest way I can think of is to write a class that extends JPanel
and override its paintComponent()
method. In the paint method you can iterate through the tree and paint each node. Here is a short example:
import java.awt.Graphics; import javax.swing.JFrame; import javax.swing.JPanel; public class JPanelTest extends JPanel { @Override public void paintComponent(Graphics g) { // Draw Tree Here g.drawOval(5, 5, 25, 25); } public static void main(String[] args) { JFrame jFrame = new JFrame(); jFrame.add(new JPanelTest()); jFrame.setSize(500, 500); jFrame.setVisible(true); } }
Take a stab at painting the tree, if you can't figure it out post what you've tried in your question.
You might consider any of these:
JHotDraw, cited here, a meta-library for creating custom graph editors.
Batik, which implements SVG rendering.
JGraph demo and user manual.
GraphStream, illustrated here.
A custom renderer, with x based on a fraction of tree breadth and y based on recursion level.
A simple graph editor such as
draw.GraphPanel
, illustrated here.
I'd say it's worth to check out Abego's TreeLayout too. It's essentially a tree layout algorithm so it can be used with any drawing mechanism, but it also contains some demos/examples of drawing graphs in SVG and Swing.
I guess you just need to read about JTree: http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html
And maybe some other general information about Swing
来源:https://stackoverflow.com/questions/10126695/how-to-draw-a-tree-representing-a-graph-of-connected-nodes