Autor
|
Tema: Dibujar un árbol en Java sin usar JTree (Leído 28,844 veces)
|
Fran88
Desconectado
Mensajes: 16
|
Buenas, estoy haciendo un proyecto para la uni en el que tengo una clase DibujarNodo que dibuja Nodos de un arbol que contienen: Nombre, texto y una lista de atributos. Esta clase tiene un metodo paint que quiero reescribir con el objetivo de pintar en un Jpanel todos los nodos del arbol independientemente del tamaño que tenga el arbol, y que si el arbol es muy grande no se solapen en pantalla los nodos ala hora de dibujarlos. Me comentaron que con un JTree se puede hacer esto, pero me prohiben usarlo, asique tengo que hacerlo yo a pelo dibujandolo sobre un JPanel. De momento no he hecho mas que las cabeceras y un ejemplo inicial del Pintar: public class DibujarNodo extends JPanel { /** */ private int CoordenadaX; /** */ private int CoordenadaY; /** */ private int SizeX; /** */ private int SizeY; /** */ public void Pintar(Graphics g) { g.drawString("Hola", 10, 10); g.drawString((this.getSize().getWidth() + ", " + this.getSize().getHeight()), 20, 20); g.drawRect(50, 50, 100, 100); g.drawLine(80, 100, 100, 200); }
} el problema q tengo es q representar eso graficamente con un arbol q tenga, 40 hijos y q por ejemplo todos ellos tengan otros 40 hijos, a mano no se puede pintar pq se empezarian a solapar en el panel. Busco un algoritmo que pueda representar graficamente un arbol donde cada nodo es un por ejemplo un cuadrado que contiene nombre y texto sobre el cuadrado. Algo similar a esto: http://www.programacion.com/cursos/jap_data_alg/images/jw-0613-java10113.gifDigamos que el panel deberia redimensionarse si el arbol se va haciendo mas grande, y el algoritmo debe hacer q no se vayan solapando. Muchas gracias!
|
|
|
En línea
|
|
|
|
Danther
Desconectado
Mensajes: 26
|
La parte grafica de la programacion es siempre la que peor se me da T.T
En tu caso, ¿no seria mejor que redimensionaras los arboles en si, mas que el jpanel? Digo, si tengo 1 arbol con 3 hijos, que ocupe todo el panel Y si tengo 1 arbol con 40, que se hagan mas pequeños para que quepan en el mismo Puedes hacer que tu aplicacion se ejecute a pantalla completa si quieres, o que empieza con un tamaño bastante grande
Si no, tampoco debe ser muy dificil calcular si cabe en el panel, y si no aumentarle las dimensiones Pero ni idea si se puede aumentar la dimension aun panel que ya esta creado Todo es cuestion de que te mires la api, si eso tendra algo como setHeigh/setWidth
|
|
|
En línea
|
|
|
|
Fran88
Desconectado
Mensajes: 16
|
La verdad esque era algo que no me habia planteado, y es una buena idea...aunque no me he puesto manos a la obra por no tener del todo claro la idea, y asi tambien es más dificil, pero seguire buscando ideas y me pondre a ello a ver si sale algo.
|
|
|
En línea
|
|
|
|
|
juancho77
Desconectado
Mensajes: 455
rie con demencia
|
mm yo calcularia la altura del arbol primero, y empezaria a dibujar desde abajo hacia arriba. Por ejemplo, si la altura(profundidad maxima entre todos los nodos) es 10, y el ultimo nivel tiene 50 hijos, entonces crearia un JPanel de 500 x 1000 ponele. Le asignas a cada nivel 500/10 pixeles y a cada cuadrado (nodo) 1000/50 pixeles. Luego, vas tomando los nodos desde el ultimo nivel al primero, y dibujandolos de acuerdo a ese tamaño. No se tendrian que solapar de ninguna manera. No se me ocurre una manera rapida de conectar hijos y padres, pero supongo que se podria hacer con un atributo en la clase Nodo. Obviamente, el JPanel lo metes adentro de otro, y le pones un JScroll, para que ponele, si mide 1000 pixeles de ancho, te muestre solo 500 y el resto haya que desplazarse. Como en Writer para desplazarse hacia abajo en las paginas..
|
|
|
En línea
|
|
|
|
juancho77
Desconectado
Mensajes: 455
rie con demencia
|
Se me ocurrieron unas ideitas, mira. Se podría dibujar el árbol desde abajo hacia arriba así: Dividir primero el panel en x*y, donde x es el número de nodos en el nivel con nodos=max (el nivel con mas nodos), y es la altura del arbol (nodo mas profundo). Luego haces, para cada nodo del nivel i, dibujarNodo(nodo). dibujarNodo busca la ubicación del padre en la lista de nodos del nivel i-1. Luego, si por ejemplo el padre esta en la posición 3, esto significa que hay dos nodos antes. Para dibujar el nodo del nivel i cuyo padre esta en i-1 en la posición 3 imaginamos que hay dos nodos antes, y hacemos las cuentas de posición como si estos existieran. Así, el nodo nos va a quedar ubicado debajo del padre. Pero antes de pintarlo, contamos la cantidad de hijos del padre y guardamos en un variable. Ponele que el padre tenga 3 hijos: la variable empieza en -60 y por cada nodo le sumas 60. Entonces, al primer hijo del padre lo pintas en Xpadre-60, al segundo en Xpadre, y al tercero Xpadre+60. Cuando tenga un rato libre lo voy a tratar de hacer. Agregame al Msn si te intersa discutirlo.
|
|
|
En línea
|
|
|
|
Fran88
Desconectado
Mensajes: 16
|
Acabo de leer tus comentarios!! jeje gracias. Recuerdo que pense en lo de dibujarlo desde abajo pero no profundice pq tenia q dejar la practica para verano!! jejeje Me pierdo un poco en lo de las posiciones del nodo padre, y como las calculas. Mi clase recibe un árbol no una lista, supongo q sera cuestion de recorrer el arbol incluso lo mismo asi es mas sencillo pq utilizo un TAD q si no recuerdo mal tiene metodos q te dan el padre y el hijo y la profundidad del arbol, etc...
Ahora mismo ando un poco liado, en cuanto pueda te agrego y hablamos.
Muchas gracias!!
|
|
|
En línea
|
|
|
|
juancho77
Desconectado
Mensajes: 455
rie con demencia
|
jeje bueno estuve pensando unas cosas y llegue a esto. DESCARGARnota: no acepto criticas relacionadas con el codigo porque lo escribi rapido y dando soluciones temporales jaja me atajo porque hay muchas variables, mucho despelote, castings donde no deberia, etc. prometo una versión final. ademas, todavia falta que el espacio en x entre nodos sea relativa. la distancia y si es relativa y varia si se agranda o achica la pantalla y cuando se agregan nodos que modifican la altura. Para modificar el arbol deben editar el constructor de la clase dibujo. las clases auxiliares son estructuras de datos que tengo en la pc y que use, todas hechas por mi. Espero sirva de algo jajaj
|
|
|
En línea
|
|
|
|
juancho77
Desconectado
Mensajes: 455
rie con demencia
|
Para que la medida en X sea relativa hay que modificar la linea 86 mas o menos que dice algo asi: int saved =((TreeNode <Integer >)arbolito. parent(p )). x+(difx *50*(Math. abs(mitad -hijosagregados )));
por esta otra int saved =((TreeNode <Integer >)arbolito. parent(p )). x+(difx *((TreeNode <Integer >)arbolito. parent(p )). x*2/nodosNivel *(Math. abs(mitad -hijosagregados )));
un saludo
|
|
|
En línea
|
|
|
|
Fran88
Desconectado
Mensajes: 16
|
He estado mirando el codigo, la parte de pintar los niveles no la tengo muy clara, si pudieras comentarla seria de gran ayuda. Gracias
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Ayuda implementar arbol trie en java
Java
|
Cooltan
|
1
|
6,549
|
3 Abril 2011, 05:20 am
por Tryptophan
|
|
|
Duda:Arbol genealogico en java
Java
|
Mioshi
|
4
|
9,783
|
30 Noviembre 2011, 20:08 pm
por Mioshi
|
|
|
JTree en Java
Java
|
neotonygold
|
1
|
4,108
|
27 Febrero 2012, 14:29 pm
por Proteus1989
|
|
|
Dibujar Arbol
Programación C/C++
|
SantyXDz
|
3
|
3,393
|
5 Noviembre 2013, 08:03 am
por edr89
|
|
|
Java Dibujar Engrane
Java
|
Darkshadic
|
1
|
2,467
|
21 Mayo 2017, 10:15 am
por 3n31ch
|
|