Java - Personalizar JTree

 
Vista:
sin imagen de perfil

Personalizar JTree

Publicado por Jennifer Puerta (7 intervenciones) el 09/03/2012 22:30:40
Buenas tardes.

Quisiera saber si alguien ha podido modificar un JTree de Java para cambiar los iconos de cada elemento en el arbol, es decir, un icono diferente para cada elemento.

No me sirve el setLeafIcon, ni el setClosedIcon ni el setOpenIcon ya que estos colocan el mismo icono para los nodos segun su estado, y no es lo que necesito ...

Un ejemplo de lo que neceisto seria lo siguiente

Raiz Arbol (con Icono1)
Nodo 1 (con Icono 2)
- Hijo1 nodo1
- Hijo 2 nodo1
Nodo 2 (con Icono 3)
- Hijo 1 nodo 2
- Hijo 2 nodo 2

Gracias de antemano!!!!!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Personalizar JTree

Publicado por Javier M (94 intervenciones) el 15/03/2012 07:18:21
Hola
lo que tienes que hacer es modificar el metido setCellRenderer del jtree
algo asi como jtree1.setCellRender(new MiRendererTree());

la clase MiRendererTree es una clase que extiende de jlabel y a la vez debes implemtarle la interfaz TreeCellRenderer:

public class MiRendererTree extends JLabel implements TreeCellRenderer {


En la clase debes crear el arreglo de los iconos que vaz a necesitar en el tree por ejemplo:

imgIconos = new ImageIcon[30];
imgIconos[0] = new ImageIcon(getClass().getResource("/horizont/controlhoras/image/icon/clock.png"));
...

Despues tienes que sobreescribir el metodo getTreeCellRendererComponent dentro de esta clase que estas creando on el siguiente codigoÑ

DefaultMutableTreeNode nodo = (DefaultMutableTreeNode) value;
String texto = (String) nodo.getUserObject();
this.seleccionado = selected;
if (!seleccionado) {
setForeground(Color.black);
} else {
setForeground(Color.BLUE);
}

if (texto.equals("Sistemas Horizont")) {
setIcon(imgIconos[0]);
} else if (texto.equals("Global")) {
setIcon(imgIconos[1]);
}

setText(texto);
return (this);

///Espero que te ayude en algo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Personalizar JTree

Publicado por Jennifer Puerta (7 intervenciones) el 16/03/2012 20:39:51
Javier, un millon de gracias por tu aporte ... de hecho ya lo habia implementado justo de esa manera (incluso capturando el valor del texto y sustituyendolo por la imagen) y pues ya lo adapte a mis necesidades y funciona de maravilla ...gracias por tu colaboración! muy amable de tu parte!

Aprovechando que me haz contestado y que aun me queda un pequeño detalle que ajustar en mi JTree, te cuento y te pregunto lo siguiente:

Yo estoy usando un JTree para simular un menu, no uso el componente java diseñado para tal fin porque el requerimiento es que la aplicacion (que es de escritorio) tenga mas apariencia de aplicacion web, entonces tome un JTree (no se si sea la forma mas optima pero esto fue lo que se me ocurrio y despues de tanto sufrir con este componente, dudo que lo cambie por otro =P ) ... en el momento que el usuario selecciona un elemento de mi arbol, yo llamo al JInternalFrame correspondiente a su seleccion, esto lo estoy trabajando con una implementacion de TreeSelectionListener, de la cual te anexo parte del codigo:

public class ControlPrincipal implements TreeSelectionListener
{
@Override
public void valueChanged(TreeSelectionEvent evt)
{
// TODO Auto-generated method stub
TreePath[] paths = evt.getPaths();

// Iterate through all affected nodes
for (int i=0; i<paths.length; i++) {
if (evt.isAddedPath(i))
{
// This node has been selected
String strMenu = evt.getPath().toString().trim();
String strOpt = strMenu.substring(strMenu.lastIndexOf(",")+1,strMenu.length()-1);

if (strOpt.trim().equals("Usuarios"))
{
ControlJInternalFrame ctrlGUsuarios = new ControlJInternalFrame();
FrmUsuario vistaGUsuarios = FrmUsuario.getInstance(ctrlGUsuarios);
if(!vistaGUsuarios.isShowing())
{
vista.mostrarPantalla(vistaGUsuarios);
}
}
}
}

Como podras notar, lo que intento es capturar el texto de la opcion seleccionada por el usuario
(con las instrucciones
String strMenu = evt.getPath().toString().trim();
String strOpt = strMenu.substring(strMenu.lastIndexOf(",")+1,strMenu.length()-1);
)

para determinar que JInternalFrame que voy a desplegar, pero si el usuario cierra el JInternalFrame e inmendiatamente intenta clickear la opcion antes seleccionada, este evento no se dispara, sino que debo seleccionar otra opcion (elemento del arbol) y luego volver a la que quiero (por ejemplo la de gestion de usuarios) para que se vuelva a disparar el evento y mostrar la pantalla de usuarios .... luego de haberme explicado, te planteo mi duda ¿Que otro evento o de que otra forma pudiese implementar esto que necesito?

Saludos y gracias de antemano ...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Personalizar JTree

Publicado por Javier M (94 intervenciones) el 16/03/2012 22:27:08
Ok

Que yo recuerde tambien tenia esa duda, yo lo resolvi en un sistema que realice, dejame buscar en mis archivos y de ahi te digo como lo solucione.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Personalizar JTree

Publicado por Javier M (94 intervenciones) el 17/03/2012 17:46:43
Mira yo hacia lo siguiente en el evento MouseClicked, con esto ya no tenia los problemas que mencionas

public void selecionarMenu(MouseEvent evt) {
TreePath p = jTree1.getClosestPathForLocation(evt.getX(), evt.getY());
nodoPinchado = (ToolTipTreeNode) p.getLastPathComponent();
String etiqueta = nodoPinchado.toString();

if (etiqueta.equals("Salir del Sistema")) {

int i = JOptionPane.showConfirmDialog(this, "Desea Salir del Sistema?", "Sistema de Control de horas", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (i == 0) {
System.exit(0);
}

}
if (etiqueta.equals("Empresas")) {
if (ifrmEmpresa1 == null) {
ifrmEmpresa1 = new ifrmEmpresa();
imprimirCategoria();
ifrmEmpresa1.setTitle("Mantenimiento de Empresa [" + this.getTitle() + "]");
jDesktopPane1.add(ifrmEmpresa1);
ifrmEmpresa1.setVisible(true);
try {
ifrmEmpresa1.setMaximum(true);
} catch (java.beans.PropertyVetoException e1) {
e1.printStackTrace();
}
} else if (ifrmEmpresa1.isClosed()) {
ifrmEmpresa1 = new ifrmEmpresa();
imprimirCategoria();
ifrmEmpresa1.setTitle("Mantenimiento de Empresa [" + this.getTitle() + "]");
jDesktopPane1.add(ifrmEmpresa1, javax.swing.JLayeredPane.DEFAULT_LAYER);
ifrmEmpresa1.setVisible(true);
try {
ifrmEmpresa1.setMaximum(true);
} catch (java.beans.PropertyVetoException e1) {
e1.printStackTrace();
}
}

}
}


//donde nodoPinchado
ToolTipTreeNode nodoPinchado = null;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Personalizar JTree

Publicado por Jennifer Puerta (7 intervenciones) el 20/03/2012 15:04:01
Excelente!, sobrecargar el metodo mouseClicked soluciono mi problema!!!!! muchas gracias por todo! me haz ahorrado dolores de cabeza! muy agradecida...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Personalizar JTree

Publicado por Wilfredo Ivan Martel Sócola (16 intervenciones) el 23/03/2012 23:01:49
El código que necesitas lo puedes encontrar en este blog.
http://neurocodigo.wordpress.com/2011/10/05/jtree-dentro-de-jtreetable-mysql/?preview=true&preview_id=84&preview_nonce=0b9691ab17

Hay un jtree que obtiene cuentas contables de una base de datos.Espero que te sirva.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar