Как нарисовать дерево, представляющее граф связанных узлов?
Я хочу отобразить дерево в графическом интерфейсе Java, но я не знаю как. Дерево представляет собой граф связанных узлов, например:
Я должен сказать, что у меня есть свой собственный класс дерева:
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 );
}
}
Я только хочу нарисовать дерево. Как я должен сделать?
4 ответа
Самый простой способ, которым я могу придумать, это написать класс, который расширяет JPanel
и переопределить его paintComponent()
метод. В методе рисования вы можете перебирать дерево и рисовать каждый узел. Вот короткий пример:
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);
}
}
Сделайте попытку нарисовать дерево, если не можете понять, что вы попробовали в своем вопросе.
Вы можете рассмотреть любой из них:
JHotDraw, цитируемая здесь мета-библиотека для создания пользовательских графических редакторов.
Библиотека визуализации Prefuse, иллюстрированная здесь и здесь.
Батик, который реализует рендеринг SVG.
GraphStream, проиллюстрированный здесь.
JFreeChart
XYBubbleRenderer
JTree
Предлагаемый здесь, с обычаемTreeIcon
,Пользовательский рендер, где x основывается на доле ширины дерева, а y - на уровне рекурсии.
Простой редактор графиков, такой как
draw.GraphPanel
, проиллюстрировано здесь.
Я бы сказал, что стоит проверить TreeLayout от Abego. По сути, это алгоритм компоновки дерева, поэтому его можно использовать с любым механизмом рисования, но он также содержит некоторые демонстрации / примеры рисования графиков в SVG и Swing.
Я думаю, вам просто нужно прочитать о JTree: http://docs.oracle.com/javase/tutorial/uiswing/components/tree.html
И, может быть, некоторая другая общая информация о Swing