elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Dibujar un árbol en Java sin usar JTree
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] 3 Ir Abajo Respuesta Imprimir
Autor Tema: Dibujar un árbol en Java sin usar JTree  (Leído 28,882 veces)
Amerikano|Cls


Desconectado Desconectado

Mensajes: 789


[Beyond This Life]


Ver Perfil WWW
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #10 en: 12 Agosto 2009, 04:13 am »

Yo tengo que hacer algo similar de tarea, para dibujar un arbol genalógico. Espero terminarla para postearlo obviamente  ;).

salu2


En línea





Mi blog:
http://amerikanocls.blogspot.com
Fran88

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #11 en: 27 Agosto 2009, 20:41 pm »

Tengo un problema ahora, he seguido la estructura del codigo de juancho77, pero en su lugar estoy pintando sobre un JPanel, el problema es que el usaba el metodo de JFrame "Pack()" para ajustar automaticamente la pantalla ala necesidad del arbol, es decir, si el arbol era mas grande se redimensionaba sola la pantalla gracias a este metodo.

Mi problema es que JPanel q yo sepa no puede usar el metodo Pack() y no conozco de la existencia de uno similar q ajuste al panel.
Sobre todo porque para dibujar en el panel he tenido q poner SetLayout(null) y el metodo "getPreferedSize" no me sirve teoricamente...
Si no pongo ese metodo SetLayout a null teoricamente podria redimensionarse, pero si no me equivoco perderia las coordenadas x e y donde pinto cada nodo...

Hasta ahora lo q he hecho ha sido añadir al final del paintComponent esta linea:
//Altura es la profundidad del arbol, el numero de niveles q tiene...
Código:
panel.setPreferredSize(new Dimension(maxNodos*130,altura*170));

el problema es que la coordenada X se inicializa al principio de cada iteracion asi:
Código:
x=(this.getWidth()/nodosNivel);
//la altura Y se obtiene multiplicando el espacio asignado a cada nivel (alto total de la pantalla dividido numero de niveles)
//por el nivel actual menos 1, para que la raiz nos quede bien arriba.
y=(i-1)*(this.getHeight()/altura);

Al hacer esto ya hay casos en los que no me pinta bien el arbol porque el calculo de la coordenada x depende del tamaño del panel, y como podeis ver en mi codigo, el tamaño del panel depende de maxNodos(nivel del arbol con mas nodos).

Creo que me muerooo, ayudaa!!!! xDDD


En línea

Fran88

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #12 en: 27 Agosto 2009, 21:02 pm »

He actualizado esa linea por esta otra:
//nodosNivel al ejecutar esta linea tiene el valor de los nodos del ultimo nivel...
Código:
panel.setPreferredSize(new Dimension((maxNodos+nodosNivel)*130,(altura+1)*170));

Parece ser q asi funciona, al menos con las 3 pruebas q he hecho, tengo q hacer mas, metiendo mas niveles al arbol pero lo pongo por si alguien me corrige.
En línea

Fran88

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #13 en: 8 Septiembre 2009, 18:37 pm »

Parece ser q el algoritmo inicial falla..no funciona para todos los casos, en cuanto metes 3 niveles el ultimo con muxos hijos se empiezan a solapar...e incluso hay veces q un nodo se sale del panel y no se ve en pantalla.

Alguna idea??

gracias
En línea

Amerikano|Cls


Desconectado Desconectado

Mensajes: 789


[Beyond This Life]


Ver Perfil WWW
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #14 en: 9 Septiembre 2009, 04:22 am »

De aqui al domingo publico el que hice para una tarea... ruegen porque me acuerde que ahora no puedo y quisa todo el trabajo que tengo me haga olvidar, pondre una alarma que me avise  ;D, el metodo en si es recursiivo que recibe la raiz del arbol n-ario y va graficando todos los demas nodos  ;).

salu2
En línea





Mi blog:
http://amerikanocls.blogspot.com
Fran88

Desconectado Desconectado

Mensajes: 16


Ver Perfil
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #15 en: 13 Septiembre 2009, 17:39 pm »

Estamos a domingo y estoy ansioso por ver tu metodo!!  ;D xD
En línea

Amerikano|Cls


Desconectado Desconectado

Mensajes: 789


[Beyond This Life]


Ver Perfil WWW
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #16 en: 14 Septiembre 2009, 20:16 pm »

Bueno lamento la demora pues como todavia ando un poco acosado de tareas solo subire el el src para que lo vean porque no me queda tiempo de explicarlo detelladamente, pero basicamente los dos metodos mas importantes se encuentran en el paquete JTGraph de la misma clase JTGraph.java dibujarArbol() y dibujarNodo().

El primero recibe la raiz del arbol n-ario y va creando BufferedImages como sea necesario segun los hijos que tenga dicho nodo, los cuales son creados en el metodo dibujarNodo, y finalmente estos BufferedImages son unidos en un BufferedImage final que sera el que se pegara en el panel.

Código
  1. public BufferedImage dibujarArbol(nodo raiz,int x,int y)
  2.    {
  3.        if (raiz.esHoja()) return dibujarNodo(raiz);
  4.  
  5.        ArrayList<BufferedImage> imagenes=new ArrayList<BufferedImage>();
  6.        BufferedImage imagenFinal;
  7.        int ancho=0,alto=0;
  8.        for (Object hijo : raiz.getHijos())
  9.        {
  10.            nodo son=(nodo)hijo;
  11.            BufferedImage im=dibujarArbol(son,0,0);
  12.            imagenes.add(im);
  13.            ancho+=im.getWidth()+GAP_X;
  14.  
  15.            if(im.getHeight()>alto) alto=im.getHeight();
  16.        }
  17.        alto+=ALTO_NODO+2*GAP_Y;
  18.        BufferedImage imagenRaiz=dibujarNodo(raiz);
  19.  
  20.        if(ancho<imagenRaiz.getHeight())ancho=imagenRaiz.getHeight();
  21.  
  22.        imagenFinal=new BufferedImage(ancho, alto, BufferedImage.TYPE_INT_RGB);
  23.        imagenFinal.getGraphics().setColor(Color.white);
  24.        imagenFinal.getGraphics().fillRect(0, 0, getWidth(), getHeight());
  25.        Graphics2D g2d=imagenFinal.createGraphics();
  26.  
  27.        g2d.drawImage(imagenRaiz, ancho/2-ANCHO_NODO/2, 0, null);
  28.        int posx=GAP_X;
  29.  
  30.        for (BufferedImage bNodo : imagenes) {
  31.  
  32.            g2d.setColor(Color.RED);
  33.            g2d.setStroke(new BasicStroke(2));
  34.            g2d.drawLine(ancho/2, ALTO_NODO+0, posx+bNodo.getWidth()/2, ALTO_NODO+GAP_Y*2);
  35.            g2d.drawImage(bNodo, posx, ALTO_NODO+2*GAP_Y, this);
  36.            posx+=bNodo.getWidth()+GAP_X;
  37.  
  38.        }
  39.  
  40.        imagenFinal.getGraphics().setColor(Color.black);
  41.        imagenFinal.getGraphics().drawRect(0, 0, getWidth(), getHeight());
  42.        return imagenFinal;
  43.    }
  44.  
  45.    /**
  46.      * netodo para dibujar un solo nodo
  47.      * @param n el nodo a dibujar
  48.      * @return una imagen con le nodo dibujado
  49.      */
  50.    private BufferedImage dibujarNodo(nodo n)
  51.    {
  52.        BufferedImage imagenNodo=new BufferedImage(ANCHO_NODO, ALTO_NODO, BufferedImage.TYPE_INT_RGB);
  53.        Graphics2D g=imagenNodo.createGraphics();
  54.  
  55.  
  56.        g.setColor(Color.CYAN);
  57.        g.fillRect(0, 0, ANCHO_NODO, ALTO_NODO);
  58.  
  59.        BasicStroke bs=new BasicStroke(3);
  60.        g.setStroke(bs);
  61.        g.setColor(Color.BLACK);
  62.        g.drawRect(0, 0, ANCHO_NODO-1, ALTO_NODO-1);
  63.  
  64.        g.setColor(Color.BLUE);
  65.        g.setFont(new Font("Arial", Font.BOLD,20));
  66.        g.drawString(n.toString(), 10, ALTO_NODO/2);
  67.  
  68.        return imagenNodo;
  69.    }
  70.  

Link: http://www.zshare.net/download/65561955ef26ba1f/

Salu2 y espero les sirva de algo ;)
En línea





Mi blog:
http://amerikanocls.blogspot.com
Amerikano|Cls


Desconectado Desconectado

Mensajes: 789


[Beyond This Life]


Ver Perfil WWW
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #17 en: 18 Septiembre 2009, 16:30 pm »

Alguien lo ha mirado o sigue en las penas???  :-\
En línea





Mi blog:
http://amerikanocls.blogspot.com
juancho77


Desconectado Desconectado

Mensajes: 455


rie con demencia


Ver Perfil
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #18 en: 18 Septiembre 2009, 22:30 pm »

jaja yo lo acabo de ver y me da verguenza la solución que di yo antes.
un abrazo viejo, buen código.
En línea

kuruchus

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Dibujar un árbol en Java sin usar JTree
« Respuesta #19 en: 9 Diciembre 2009, 13:46 pm »

Tengo yo que hacer algo parecido.

Agradezco el aporte de juancho77 (aunque el link está caído) y de AmeRiK@nO.

Fran88, ¿al final qué código utilizaste?

Gracias
En línea

Páginas: 1 [2] 3 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda implementar arbol trie en java
Java
Cooltan 1 6,562 Último mensaje 3 Abril 2011, 05:20 am
por Tryptophan
Duda:Arbol genealogico en java
Java
Mioshi 4 9,804 Último mensaje 30 Noviembre 2011, 20:08 pm
por Mioshi
JTree en Java
Java
neotonygold 1 4,115 Último mensaje 27 Febrero 2012, 14:29 pm
por Proteus1989
Dibujar Arbol
Programación C/C++
SantyXDz 3 3,397 Último mensaje 5 Noviembre 2013, 08:03 am
por edr89
Java Dibujar Engrane
Java
Darkshadic 1 2,482 Último mensaje 21 Mayo 2017, 10:15 am
por 3n31ch
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines