Facebook se está convirtiendo en una herramienta que nos permite mantener el contacto con mucha gente y de una manera muy eficaz. No hay que mitificarlo, pero la realidad es que mucha gente pasa mucho tiempo en las redes sociales, y Facebook va primero en la competición. Dejando al margen las polémicas sobre la falta de privacidad en Internet, sobre lo confiados que podemos llegar a ser a la hora de «compartir nuestra vida», conviene saber que podemos limitar qué se puede ver y quién lo puede ver en ésta red social.
Manos a la obra, nos hemos puesto a trastear todo el Facebook, tocando todos los botones, el resultado de toda ésta aventura ha sido ésta entrada del blog. Vamos al grano.
Configurando la lista de contactos
Para empezar debemos de tener claro que podemos clasificar a nuestros contactos, y en función de ésto verán cierta información o publicaciones sobre nosotros. Algunos tenemos a familiares, amigos del alma, amigos, conocidos, compañeros del trabajo, jefes, clientes, profesores, compañeros de clase, profesores de nuestros hijos, o incluso desconocidos. Muchos con cientos de contactos, ya me es habitual ver gente con más de 500 amigos, 600, 700. Y hasta cierto punto no es razonable mezclar las cosas…
Toda la clasificación de los contactos se hace por lo que Facebook llama listas inteligentes. Es un gran avance y soluciona muchos problemas ocasionados por la falta de privacidad. Las principales son:
Con acceso restringido.
Conocidos.
Amigos.
Mejores amigos.
Familia.
Podemos hacer otras listas con el nombre que queramos y poner a nuestros contactos en ellas. Éste orden nos va a servir luego para configurar quién ve qué cosas de nuestro Facebook.
En la imagen de arriba podemos ver el famoso botón que tenemos cuando vemos la página o publicación de un amigo, si le damos click se despliega un menú como el de la image. Ahí podemos poner en mejores amigos o en conocidos.
Si le damos a añadir a otra lista, nos saldrá una ventana como la de la imagen de la izquierda, donde podremos poner al contacto en cualquiera de las listas que tengamos definidas. Las listas inteligentes que veremos algunas se crean automáticamente, podemos crear nuevas. Por defecto familia y acceso restringido vienen creadas.
Niveles de privacidad
Para entender la privacidad, tenemos establecidos ciertos niveles de privacidad, parecidos a la clasificación anterior:
Acceso restringido.
Conocidos.
Amigos.
Mejores amigos y familia.
La lista de acceso restringido es especial, porque las personas que estén en ésta lista no van a ver casi nada de nosotros, sólo lo que hagamos público. Es decir, sólo verán lo totalmente público, igual que las personas que no están en nuestra lista de amigos. Es el nivel más estricto de privacidad. El siguiente nivel son los conocidos, le siguen los amigos, mejores amigos y familia. A cada siguiente nivel ven lo del anterior más ciertas cosas.
Los familiares y mejores amigos también son un caso especial, porque entre ellos no hay diferenciación en mayor o menor visibilidad. Es decir, un familiar va a ver lo mismo que los amigos y algo más, de igual manera que un mejor amigo. Pero lo publicado para mejores amigos no lo ven los familiares y viceversa. Si queremos publicar algo para mejores amigos y familia tendremos que personalizar la publicación que luego se explica más abajo.
¿Dóndo configuro la privacidad?
Una vez organizados los contactos, ya podemos cambiar la visibilidad de casi todo nuestro Facebook en función de la clasificación que acabamos de hacer. Lo lógico es no publicar lo mismo, o que los clientes de trabajo no anden viendo nuestras fotos privadas de familia o con los amigos. Hay a quién no le importa, pero tenemos la posibilidad de configurarlo.
Para acceder a todas las configuraciones de Facebook debemos hacer click arriba a la derecha en el icono de rueda dentada o en el candado. En el candado tenemos acceso directo a algunas de las configuraciones pero si le damos a ‘Ver más’ podemos acceder al total de configuraciones. Con la rueda dentada, en la opción ‘Configuración de la cuenta’, o ‘Configuración de la privacidad’ llegamos a las mismas configuraciones.
Accediendo veremos lo explicado en las siguientes secciones.
Configuraciónes de privacidad, biografía y etiquetado
Hay muchas opciones para configurar, las pricipales para conseguir un Facebook con control de lo que ponemos las tenemos aquí. Es muy útil comprobar lo que ven otras personas de tu biografía mientras que vamos configurando el sistema, ésto lo podemos ver haciendo click en ‘Ver como’, de las configuraciones en ‘Biografía y etiquetado. En la siguiente imagen tenemos todas las configuraciones, sobran explicaciones, ya que Facebook nos relata para qué sirven.
En la opción de ‘Privacidad’, tenemos una herramienta bien útil con la que podemos limitar el público de publicaciones antiguas. En versiones anteriores de Facebook venía ocurriendo que teníamos publicado a todo el mundo todo lo que poníamos en Facebook.
No estoy exagerando, aún a fecha de hoy, veo gente de Facebook que no tengo en mi lista de amigos, de la que puedo ver todos sus datos, fotos, amigos, direcciones, teléfonos, etcétera… Ésto es un peligro porque estamos expuestos a que personas malintencionadas usen ésta información para malos fines. Así que, lo suyo sería limitar las publicaciones antiguas siguiendo las instrucciones.
Cómo indica la opción, podemos configurar quién puede ver las publicaciones que hagamos a partir de ahora. Antiguamente ésto venía siendo público, con lo que cualquiera podría ver nuestras publicaciones. Conviene ponerlo por lo menos para los amigos.
Una opción intersante que tenemos es la de no permitir que los buscadores nos encuentren, o que cualquiera pueda hacernos una petición de amistad. Por ejemplo, si desactivamos que los buscadores nos puedan encontrar, aunque alguien tenga nuestra dirección de Facebook, le saldrá un mensaje como el siguiente:
Ya a gusto de cada uno su configuración.
Publicando
A la hora de poner algo en un muro tendremos la oportunidad de limitar la visibilidad. Eligiendo quién va a poder ver lo que publicamos. Lo mismo podemos hacer a la hora de poner fotos, vídeos o álbumes. Podemos incluso limitar foto a foto quién puede verlas.
Como se puede ver en la imagen, si personalizamos la publicación, podremos elegir entre las listas que tengamos para que puedan verlo. También podremos elegir las personas una a una que podran verlo.
Es interesante que en algunas secciones tenemos un lápiz con el que podemos entrar a editar la privacidad de dicha sección. Cada una tiene su forma de configurarse, los libros, películas, información personal, etcétera. Por su naturaleza cada una es distinta y tenemos las instrucciones donde paso a paso Facebook nos va a indicar cómo configurarlo.
Para terminar es intersante saber que podemos reconfigurar la visibilidad de una publicación ya hecha en nuestro muro. Tenemos un botón como el de la imagen de la derecha con el que podemos cambiarlo. Estado a estado, de todas las publicaciones.
Terminando
Hay muchas configuraciones más, pero las principales para la privacidad son las mencionadas anteriormente. Para más información nos remitimos a la Ayuda de Facebook.
Mega con sus 50 Gigas gratis y con la buena calidad de su servicio, vemos que gana puntos en la competición por liderar el almacenamiento en la nube. Reciéntemente, el pasado viernes 6 de noviembre del 2013 ha salido de su fase de pruebas, con una interfaz renovada y algunas nuevas características. En los últimos años estamos viendo como el almacenamiento de los discos duros es mayor y cada vez son más baratos. En Internet los espacios para correos electrónicos, páginas web, o los servicios de almacenamiento en la nube estan creciendo. Drive que nos ofrece 15 Gigas gratis junto con la cuenta de Gmail para correos electrónicos. Dropbox con 2 Gigas iniciales gratis que vas incrementando realizando ciertas tareas. Skydrive de Microsoft con sus 25 Gigas. Y un largo etcétera..
Un poco de historia
Mega nace de la mano del polémico Kim Dotcom. Un año después del cierre de Megaupload nació Mega.co.nz, ofreciendo su servicio de almacenamiento en la nube. En la primera hora de su lanzamiento en enero del 2013 se registraron alrededor de 100 000 personas, en el primer días más de 1 millón, fué tal el éxito que se llegó a colapsar el servicio. Pero los usuarios han sido conscientes del éxito que tuvo su predecesor, Megaupload, que han sido pacientes y en foros varios se pueden leer buenas referencias al respecto.
Características principales
Analicemos las principales características técnicas de la cuenta gratuita:
– Tenemos disponibles 50 gigas, que podemos usar con todo tipo de archivos en tamaños y en número.
– Siempre todo el servicio se ofrece a través de conexiones HTTPS, es decir, conexiones cifradas. Incluso las transferencias de archivos entre nosotros y Mega se realizan a través de HTTPS. – Podemos compartir con quien queramos nuestros ficheros haciendo enlaces que podemos enviar a amigos o a quien consideremos.
– Se ha optimizado al máximo la página web, ofreciendo un servicio ágil donde podemos coger y soltar archivos, renombrarlos, moverlos de carpeta, etcétera.
– Sistema por el que se guardan archivos temporales en nuestro ordenador para agilizar su funcionamiento.
– Podemos usar avatares con nuestros contactos.
– Compartir archivos con nuestros contactos.
– Un árbol de directorios mejorado.
– Ahora podemos seguir subiendo o bajando ficheros mientras que navegamos por las secciones. – Firefox, está tomando la delantera en compatibilidad y prestaciones.
Todo ésto sin instalar nada en nuestro ordenador, sólo con un registrarnos podremos acceder desde cualquier dispositivo que tenga navegador o con sus aplicaciones a los servicios de Mega.
Otras características
Aún en fase beta, tenemos un cliente de sincronización de archivos para Windows, que permite establecer incluso varias carpetas individuales para que se mantengan iguales tanto en la nube como en tu ordenador. En Google Play tenemos una aplicación para sincronizar ficheros entre nuestro Tablet o Smartphone y Mega.
También tenemos disponible el Kit de Desarrollo para crear programas usando su almacenamiento. Mega está cogiendo fuerza con sus políticas empresariales y está dejando atrás su modelo de negocio de Megaupload. Hay programas para trabajar como distribuidor de cuentas pro. Sus versiones de pago parten de casi 100 € al año por 500 Gigas a los casi 300 € al año por 4 Teras, con anchos de banda muy generosos.
Con las pruebas de la cuenta gratuita se ve que el servicio es muy bueno. Las descargas y subidas a la nube son al máximo que nos permite la red.
Después de las polémicas noticias que corren sobre la privacidad en Internet con respecto al ciber-espionaje por parte EEUU y otros organismos internacionales, la población estamos más conscientes de todo ello. Mega no es que tenga un sistema 100% seguro. Decir eso sería como asegurar que es imposible que te caiga un rayo: si nos ponemos a correr con una bateria conectada a una antena en una noche de tormenta eléctrica por una montaña tenemos muchos puntos para conseguir que nos caiga. De todos modos hay que tener en cuenta que los servidores de Mega están montados en Nueva Zelanda, con sus propias leyes. Y los usuarios siempre seremos los últimos responsables de lo que hagamos con nuestros actos, dentro o fuera de Internet.
Después de los casos de acceso a tus archivos por parte de las empresas (por ejemplo Microsoft que revisa tus archivos automáticamente, Google con sus anuncios relacionados..), Mega se ha curado en salud haciendo muy complicado que ellos mismos puedan acceder a tus archivos. Pero no vamos a entrar en temas criptográficos o ciberseguridad porque no es objetivo de éste artículo.
El futuro próximo
Para antes de terminar el año 2013, se prevee el lanzamiento de la aplicación para iOS y que salga de la fase de pruebas el cliente de sincronización https://mega.co.nz/#sync. En 2014 se espera el lanzamiento de un sistema de mensajería y videoconferencia cifrado y basado en la web.
Lento pero a buen ritmo Mega va sorprendiéndonos con la calidad de sus servicios: buen diseño, usabilidad, servicios innovadores.. Hemos leido sobre la venta de música, películas, podríamos especular sobre las posibilidades de los servicios en la nube. Si hay algo claro, es que en Informática si algo que se pueda pensar, normalmente se puede crear, otro asunto es que merezca la pena invertir tiempo en ello o si la ley lo permite.
Resumiendo
Para terminar queda decir que Mega es un servicio como los otros de que ya disponemos, pero que en las pruebas realizadas ha funcionado muy bien, y tiene precios muy económicos en sus versiones de pago. Seguro que Mega seguirá sorprendiéndonos. Y a fecha de hoy, un servidor que les escribe piensa que Mega con sus servicios está ‘tirando del carro’, motivando a que los grandes competidores como Google, Microsoft, Dropbox.. se pongan las pilas y mejoren sus servicios. Al fin y al cabo, todo ésto es bueno y los beneficiados vamos a ser los usuarios, ya seamos clientes gratuitos o de pago.
Lleva desde el 2006 entre nosotros. Aunque es muy desconocido fuera del ámbito de la informática es una realidad. En España se están comercializando éstos pequeños ordenadores en kits de inicio que parten desde unos 50 € aproximadamente. Tiene la mejor relación calidad-precio del mercado, ya que no hay detrás una empresa con ánimo de lucro, no hay patentes, software de pago, etcétera.. simplemente un circuito integrado con sus accesorios. Y la total libertad para programarlo o configurarlo a nuestro gusto.
Raspberry Pi es un proyecto que arrancó en el ámbito de la educación, creando un pequeño ordenador del tamaño de una tarjeta de crédito. Su precio final es realmente barato, sólo 24 libras el modelo de 256 megas de RAM y por 31 libras el de 512 megas. El modelo B, el más avanzado, corre un procesador a 700 MHzs, tiene USB 2.0, HDMI, conector RCA, salida de audio de 3.5 mm, ranura para tarjeta SD, tarjeta de red integrada.. Opcionales se pueden comprar todo tipo de accesorios como cajas, cámaras, para ampliar los puertos USB, etcétera. Y sus aplicaciones como ordenador para la televisión o cualquier otro uso no tiene límites. El consumo que viene a tener es de sólo 3.5 watios, como una lámpara de LEDs, se puede alimentar con un cable micro USB con un simple cargador de móvil.
Tenemos sistemas operativos compatibles que son distribuciones de Linux totalmente gratuitas y orientadas según el uso que se le vaya a dar: para navegar, para almacenar datos en red con discos duros, cualquier cosa es posible. En la página oficial del proyecto tenemos algunas. Para empezar a funcionar con éste micropc se recomienda empezar por una de éstas. Siendo Linux siempre cabe la posibilidad de modificarlo, y disponemos de todo el código fuente para adaptaciones de todo tipo. La página de descargas es:
Los usos que se le vienen dando a éste ordenador no tiene límites. En enero del 2013 se publicaba un proyecto con el que se construyó un supercomputador barato uniendo en red 64 Raspberry Pi:
Hay testimonios de gente ejecutando LibreOffice y Firefox sin ningún problema. Otro ejemplo, junto con Google, está el proyecto Coder para convertir éste pequeño ordenador en un servidor de aplicaciones muy económico. No hacen falta conocimientos avanzados para montar nuestro propio Raspberry Pi en casa. Cada vez más empresas lo estan comercializando con cajas muy presentables con todo tipo de colores, formas e incluso transparentes. No hay más que coger nuestro buscador de Internet favorito y encontraremos infinidad de resultados. Es un pequeño juguete, y a la vez no tan «juguete». Un proyecto en constante desarrollo y con gran futuro, que seguro que va a dar mucho que hablar.
OpenSource que significa código abierto en castellano, se acuña mucho en éstos tiempos en el ámbito de la informática. Está revolucionando la informática en la empresa y también en nuestros hogares. ¿Sabemos qué tanto podemos ganar por usar programas de código abierto? Son totalmente gratuitos y colaboran en su desarrollo hasta millares de personas de todo el mundo.
Algunos proyectos que le pueden ser muy útiles son:
– Otro editor de imágenes pero vectoriales, Inkscape.
– VLC, un reproductos multimedia compatible con casi todo.
– Los proyectos de la familia Mozilla, como el navegador Firefox.
– Etcétera..
Tenemos disponibles todo tipo de soluciones: para tratamiento de textos, hojas de cálculo, bases de datos, edición de vídeo, imagen, audio.. Tenemos completos sistemas operativos, gestores de contenidos web, navegadores, entornos de programación, avanzados sistemas de gestión de la información.. y un largo etcétera.
Nos mantenemos al día en los proyectos de código abierto, los utilizamos siendo herramientas esenciales de nuestro negocio. Por ello podemos bajar los precios y dar la mejor calidad.
Parece ser que están dando guerra las tablas xD A continuación les dejo un post con un ejemplo de tabla con cajas seleccionables y otros valores que son en éste caso enteros. Luego tenemos un botón con el que podemos recorrer la tabla (el modelo que representa los valores de la tabla) e ir borrando las filas que tienen la caja seleccionable seleccionada, valga la redundancia…
private static final long serialVersionUID = 1L; private JPanel contentPane; private JTable table;
/** * Launch the application. */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { TablaSeleccionable frame = new TablaSeleccionable(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }
/** * Create the frame. */ public TablaSeleccionable() { setTitle("Tabla seleccionable by jnj"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 604, 347); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null);
JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 11, 560, 227); getContentPane().add(scrollPane);
String[] columnas = { "Los checkbox", "Un dato", "Otro dato" }; final DefaultTableModel modelo; modelo = new DefaultTableModel(null, columnas);
// hay que programar nuestra propia función getColumnClass para // poder poner controles como por ejemplo el checkbox con los datos // booleanos table = new JTable(modelo) { private static final long serialVersionUID = 1L;
@Override public Class getColumnClass(int column) { switch (column) { case 0: return Boolean.class; case 1: return Integer.class; case 2: return Integer.class; default: return Boolean.class; } } };
// INSERTA UNOS DATOS EN LA TABLA for (int i = 0; i < 10; i++) { Object[] nuevafila = { false, i, i }; modelo.addRow(nuevafila); }
// BOTON QUE ELIMINA FILAS, // Recorre de atrás hacia adelante las filas eliminando las // seleccionadas. JButton btnEliminarFilas = new JButton("Eliminar filas"); btnEliminarFilas.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) { for (int i = 9; i >= 0; i--) { // si la fila i, columna 0 es true, es porque está // seleccionado el checkbox, entonces borra if (((Boolean) modelo.getValueAt(i, 0)) == true) { modelo.removeRow(i); } }
En el ejemplo he puesto un DefaultTableModel por su simplicidad. Hay otras formas de hacer lo mismo, como viene siendo habitual en programación. Espero que sirva.
Siguiendo los minitutoriales de la serie Swing, he desarrollado éste post sobre tablas para aprender a usar un poco más las tablas. Vamos al grano. Introducción
Es necesario:
Entorno de Desarrollo.
El JDK o JRE, yo he usado el JDK 1.7, pero ya Swing no sigue en desarrollo así que no tiene mucha importancia la versión que uses.
Trato de explicar cómo poner cajas seleccionables (checkbox), listas desplegables (combobox) y cajas de texto formateado, en una tabla. En el ejemplo he puesto una caja que sólo admite un número de 3 dígitos. Más adelante lo vemos.
Para manejar los datos puedes usar directamente el modelo de datos que autogenera un JTable, puedes usar un AbstractTableModel como aparece en muchos de los tutoriales que he encontrado por Internet, o puedes usar una implementación de DefaultTableModel, que internamente usa un vector con el que te permite añadir o borrar filas de forma dinámica. Yo he usado un DefaultTableModel que me ha parecido más interesante porque muchas veces necesitamos añadir o borrar datos de una tabla.
getContentPane().setLayout(null); JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 11, 810, 271);
getContentPane().add(scrollPane);
// usa mi modelo de datos modelo = new MiModelo(); // crea la tabla con mi modelo tabla = new JTable(modelo);
// scrollPane.setViewportView(tabla);
// EDITORES PERSONALIZADOS EN LA TABLA // la caja seleccionable, el checkbox lo pone sólo // con la función getColumnClass TableCellEditor editor;
// configura el combo JComboBox comboBox = new JComboBox(); comboBox.addItem("Opción A"); comboBox.addItem("Opción B"); comboBox.addItem("Opción C");
// configura el campo de texto JFormattedTextField campoTexto = null; try { // sólo admite 3 números campoTexto = new JFormattedTextField(new MaskFormatter("###")); } catch (Exception e) { System.out.println(e.getMessage()); }
// combo a la columna 3 editor = new DefaultCellEditor(comboBox); tabla.getColumnModel().getColumn(3).setCellEditor(editor);
editor = new DefaultCellEditor(campoTexto); tabla.getColumnModel().getColumn(4).setCellEditor(editor);
// capturador de eventos del ratón en la tabla // autogenerado con Eclipse tabla.addMouseListener(new MouseListener() {
@Override public void mouseReleased(MouseEvent e) { // TODO Auto-generated method stub
}
@Override public void mousePressed(MouseEvent e) { // TODO Auto-generated method stub
}
@Override public void mouseExited(MouseEvent e) { // TODO Auto-generated method stub
}
@Override public void mouseEntered(MouseEvent e) { // TODO Auto-generated method stub
}
@Override public void mouseClicked(MouseEvent e) { // TODO Auto-generated method stub
int fila = tabla.rowAtPoint(e.getPoint()); int columna = tabla.columnAtPoint(e.getPoint());
JOptionPane.showMessageDialog(null, "Valor de la celda: " + tabla.getValueAt(fila, columna).toString()); } });
}
// modelo de datos, usa DefaultTableModel que internamente // tiene un vector que nos permite por ejemplo añadir una fila // fácilmente con addRow... private static class MiModelo extends DefaultTableModel {
// constructor de la clase, simplemente pone unos datos en el vector de // datos. public MiModelo() { super(nombresColumna, 0);
// carga unos datos iniciales... for (int i = 0; i < 10; i++) {
Object[] aux = { i, Math.random(), i % 2 == 0, "Opción A", "123" };
addRow(aux);
} }
@Override public Class getColumnClass(int columnIndex) { // necesario para que dibuje la tabla con los tipos de columna return tiposColumna[columnIndex]; }
}
}
También he añadido la captura de eventos del ratón. Al escribir tabla.addMouseListener(new Mouse… podemos usar la combinación de teclas Ctrl + espacio y Eclipse nos intentará autogenerar el código. Ésto mismo se puede usar en cualquier momento, si Eclipse detecta que estás escribiendo algo que conoce te lo pone en un listado o si sabe seguro lo que vas a escribir lo autogenera. Es un comportamiento muy útil.
Explicaciones
He usado un DefaultTableModel que internamente tiene un vector de filas, para poder usar la función addRow() y así simplificar todo un poco que para eso está la clase DefaultTableModel.
La historia de configurar la tabla está en la clase MiModelo, espero haber dejado lo bastante comentado el código como para no explicar de nuevo aquí lo que hace. De todas formas si queda duda, mensaje aquí abajo que lo contesto en cuanto pueda.
Podemos obtener el vector de datos de la forma:
Vector data = modelo.getDataVector();
Hay muchas funciones interesantes que nos permitirán hacer lo que necesitemos. Para hacerse una idea, en mi Eclipse pongo modelo. y se me despliega el listado de funciones que tengo disponibles:
Tenemos la que ya he dicho addRow para añadir una fila, getRowCount que devuelve el número de filas, y muchas más. Algunas funciones necesitan un post entero para explicarlas así que lo dejaré aquí.
Donde pone tabla.addMouseListener(… está todo lo relacionado con el ratón. Podemos programar acciones para cuando se hace click, cuando se aprieta el botón, cuando se libera, etcétera…
Sobre los editores personalizados en una tabla hay que decir que admite cajas chequeables, listas desplegables y campos de texto. Además se pueden crear nuevos editores, como por ejemplo el que cita en la documentación oficial de un editor de celda que nos permite elegir entre una tabla de colores.
Más información
Me remito como siempre a la documentación oficial:
De todas formas hay muy buena información en otras páginas web, espero que si has leido éste tutorial por lo menos te haya aclarado algo, o te sirva el código fuente.
Curioseando un programa que utilizo últimamente, el PDF24 Creator, además de en Windows he visto que tenía un Gadget para añadir en Blogger, es decir aquí. Así que lo he puesto en el menú para poder descargar una versión en PDF de lo que sea que esteis viendo en el blog. Lo teneis en la sección PDF para generar un fichero si es que te quieres guardar algo de lo que publico aquí.
Es un programa de Windows, 100% gratuito según reza en su página web donde lo teneis en descarga:
Funciona muy bien, te escanea documentos y los guarda a PDF de manera muy simple, puedes crear documentos de varias páginas, también instala una impresora virtual con la que puedes imprimir desde cualquier programa y te genera un documento. En fin, lo que he probado funciona muy bien y me ha sido muy útil. Todo un complemento digno de mención, y 100% gratis.
Lo único que le hecho en falta, aunque no lo he necesitado mucho la verdad, es un editor PDF con el que se puedan editar el contenido de un documento. Eso sí, a fecha de hoy lo que se puede hacer es mover las páginas de orden, de un documento a otro, pero no se puede editar una página en sí.
Buena herramienta de todas formas, seas programador o no. ¿He comentado que es 100% gratis?
Siguiendo con los minitutoriales de Swing, ha llegado la madre del cordero del manejo de datos. Tarde o temprano necesitamos visualizar, modificar, borrar o guardar datos. Podemos hacer formularios, recorrer tablas guardadas en variables ocultas, usar listas, al final la manera más simple de mostrar muchos de éstos datos es una tabla, que en Swing se llama JTable.
Para seguir éste tutorial hace falta, un entorno de desarrollo (por ejemplo Eclipse), el JDK o el JRE, y un poco de paciencia xD
Si eres un máquina entonces descárgate directamente el código y no te olvides de visitarme de vez en cuando, a ver si aumentan las visitas =)
A saber
Antes de empezar hay que saber que un JTable es un componente Swing, que va a visualizar unos datos que se almacenan internamente en una variable de tipo TableModel. No se recomienda usar directamente pero si no lo necesitamos para qué vamos a complicarnos más la vida en usar otros métodos. Lo he usado para no complicar el ejemplo.
En el ejemplo se va a usar un DefaultTableModel el cual va a guardar referencia del TableModel que tiene la tabla. Entonces cuando se modifica, en éste caso añadiendo más filas, automáticamente la tabla se redibuja y muestra los datos actualizados. Se recomienda usar un AbstractTableModel para manejar los datos pero eso es otro tema.
Comenzando
Gran parte del código se puede generar con Eclipse. Así que los pasos a seguir para emepezar son:
Crear un nuevo proyecto Java.
Añadir un JFrame que genere todo el esqueleto de la ventana.
En el Swing Designer en vista de diseño poner un Absolute Layer que nos permitirá posicionar los elementos donde queramos.
Poner un JScrollPane y dentro de él el JTable, de esta manera si la tabla crece más que lo que vemos apareceran barras de scroll como las de la imagen anterior.
El botón de abajo que meterá contenido en la tabla.
Hecho ésto hago doble click en el botón y me muestra todo el código recién generado listo para seguir implementando.
El código
A continuación el código lo más legible que he podido poner:
// versión private static final long serialVersionUID = 1L;
// la tabla private JTable table;
// el modelo de tabla, aquí van a estar los datos. private DefaultTableModel model;
// función principal public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { JavaSwing9JTable frame = new JavaSwing9JTable(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }
// constructor del frame que contruye toda la ventana... public JavaSwing9JTable() { //título setTitle("Java Swing 9 El JTable"); // cuando cerramos la ventana se cierra la aplicación por completo setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // dimensiones y posición setBounds(100, 100, 596, 331); // establece una capa absoluta para posicionar los elementos donde queramos getContentPane().setLayout(null);
// el panel con barras de scroll automáticas JScrollPane scrollPane = new JScrollPane(); // dimensiones y posición del panel de scroll scrollPane.setBounds(10, 11, 560, 227);
// se añade el panel de scroll a la ventana getContentPane().add(scrollPane);
// nombre de las columnas String[] columnNames = { "ID", "Un dato", "Otro dato" };
// creo un modelo de datos, sin datos por eso 'null' y establezco los // nombres de columna model = new DefaultTableModel(null, columnNames); // creo la tabla con el modelo de datos creado table = new JTable(model);
// se pone la tabla en el scroll scrollPane.setViewportView(table);
// código del botón JButton btnAadirLnea = new JButton("Meter contenido"); btnAadirLnea.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
// aquí se añaden datos a la tabla for (int i = 0; i < 100; i++) {
// creo un vector con una fila Object[] aux = { i, i * 34, Math.random() };
// añado la fila al modelo model.addRow(aux);
}
} }); // dimensiones y posición del botón btnAadirLnea.setBounds(10, 249, 267, 23); // pongo el botón en la ventana getContentPane().add(btnAadirLnea);
Ésta es la forma más simple que he encontrado de usar una tabla de Swing. El paso siguiente es usar un AbstractTableModel, crearnos una clase que la implemente, con la que podemos entonces hacer cosas como meter cajas seleccionables o cuadros desplegables en las filas.
Más información
Hay mucha información en Internet, me remito primero a la documentación oficial, está en inglés y es muy extensa:
Espero que sirva. En próximos posts espero ver cómo controlar los clicks del ratón, esos temas que citaba de la clase AbstractTableModel, formularios maestro-detalle, etcétera…
Podemos ver por todos lados la palabra Bean, significa vaina en inglés. Se puede leer en los lugares más variopintos: desde el NetBeans, los Java Beans, los Beans en Visual Studio, Eclipse, los Enterprise Java Beans, los Beans que usamos para acceder y guardar datos de nuestros programas.. pero ¿qué es un Bean de Java?
Hoy les dejo un acceso a una base de datos SQLite, que últimamente está tan de moda. SQLite se usa en todo tipo de programas, es de dominio público, se puede incluir en tu programa añadiendo alguna librería muy ligera, y te da casi todas las funcionalidades que te puede dar cualquier otra BD relacional (de las que usan SQL).
Materiales
Una vez más, mi entorno de desarrollo favorito, el Eclipse que supongo ya instalado. También se puede seguir el post usando otro entorno http://www.eclipse.org/
Lo que he averiguado en mis investigaciones, más que nada con lo que me han explicado amigos, es que SQLite lo que no tiene son claves ajenas, con lo que la integridad referencial no está implementada dentro de su llamemosle «motor de la BD» es que tenemos integridad referencial, claves ajenas. Se pueden usar disparadores (triggers), cuando se hagan inserciones, modificaciones o borrados. Podemos usar BLOBs, definir los tipos de datos de las tablas, y un largo etcétera…
Según pone en la Wikipedia http://es.wikipedia.org/wiki/SQLite, la versión 3 de SQLite admite archivos de 2 Terabytes con incluso tipos de datos BLOB, con lo que podemos almacenar ficheros dentro de la base de dato. Con ésto creo que tenemos bastante, por lo menos para empezar a trastear las BD sin tener que instalar todo un señor motor de BD como los de Oracle o MS SQL Server, o los que más me gustan a mi como PostgreSQL o Firebird. En Java funcionan todas éstas BD de manera parecida, la idea principal es usar el JDBC que proporciona un estándar de conexión para conexión a bases de datos desde Java.
Manos a la obra
Al grano, después de un poco de teoría, antes de empezar con el código, hay que preparar el proyecto en Eclipse:
Creo un nuevo proyecto de Java.
Copio la librería de SQLite, en el proyecto, Eclipse te deja coger y arrastrar el fichero al Explodor de Proyectos con lo que te proguntará si quieres copiar o hacer un enlace externo al fichero. Prefiero copiarlo dentro del proyecto porqué así siempre estará incluido si es que creamos un ejecutable o nos llevamos el proyecto a otro ordenador.
No basta con copiar la librería, tenemos que agregarla al Build Path del proyecto. Con el botón derecho del ratón en el explorador de proyectos, le damos a Build Path > Configure Build Path… Le damos a Add JAR… y elegimos el fichero que ya está dentro del proyecto. Debes ver una ventana parecida a ésta:
Hecho ésto ya podemos usar la librería desde cualquier clase que creemos dentro de éste proyecto. Entonces ya sí que sí, que empezamos creando una nueva clase, con un main. Yo he usado el generador de código de Eclipse y me ahorro tiempo. Entonces el código de ejemplo con el que se crea un fichero bdpruebas.db, luego dentro crea una tabla llamada tablapruebas, y va insertando valores aleatorios del 1 al 100 con un índice. Queda así:
// CREAR UNA TABLA NUEVA, LA BORRA SI EXISTE enunciado.execute("DROP TABLE IF EXISTS tablapruebas;"); enunciado.execute("CREATE TABLE tablapruebas (id int primary key, aleatorio int);");
// INSERTAR DATOS for (int i = 1; i <= 100; i++) { enunciado.execute("INSERT INTO tablapruebas (id, aleatorio) values (" + i + ", " + Math.floor(Math.random() * 100 + 1) + ");"); }
// CONSULTA DATOS ResultSet resultados; resultados = enunciado.executeQuery("SELECT * FROM tablapruebas;");
// PROCESAR EL RESULTADO while (resultados.next()) { System.out.println("id " + resultados.getString(1) + ": aleatorio " + resultados.getString(2)); }
Lo que hace el código es crear tres objetos: conexión, enunciado y resultados. Con conexión como su nombre indica, nos conectamos a la base de datos, si el fichero no existe lo crea, ésto es un comportamiento propio de SQLite. Con el enunciado lo que venimos a tener es una especie de «mesa de trabajo» con lo que vamos a atacar la base de datos con todo tipo de consultas o sentencias SQL. Es interesante el PreparedStatement para mejorar el funcionamiento interno de nuestro programa pero eso es otro tema. Luego con el objeto resultados en éste ejemplo lo que se hace es almacenar los resultados de la consulta.
Las sentencias SQL que se han usado lo que hacen es borrar la tabla si existe, la crean y llenan la tabla con los INSERT INTO. La última consulta con el SELECT lo que hace simplemente es listar todos los resultados de la tabla.
Dejo el proyecto en descarga como viene siendo costumbre xD
Para terminar, si pulsamos F11 en la ventana de consola debemos ver en los resultados algo tal que así:
id 1: aleatorio 4 id 2: aleatorio 70 id 3: aleatorio 94 id 4: aleatorio 40 id 5: aleatorio 86 id 6: aleatorio 40 id 7: aleatorio 89 id 8: aleatorio 80 id 9: aleatorio 79 id 10: aleatorio 14 id 11: aleatorio 69 id 12: aleatorio 2 id 13: aleatorio 12 id 14: aleatorio 62 id 15: aleatorio 74 id 16: aleatorio 53 id 17: aleatorio 45 id 18: aleatorio 44 id 19: aleatorio 56 id 20: aleatorio 40 id 21: aleatorio 81 id 22: aleatorio 75 id 23: aleatorio 97 id 24: aleatorio 78 id 25: aleatorio 63 id 26: aleatorio 30 id 27: aleatorio 13 id 28: aleatorio 21 id 29: aleatorio 68 id 30: aleatorio 58 id 31: aleatorio 25 id 32: aleatorio 92 id 33: aleatorio 88 id 34: aleatorio 77 id 35: aleatorio 38 id 36: aleatorio 45 id 37: aleatorio 18 id 38: aleatorio 47 id 39: aleatorio 60 id 40: aleatorio 51 id 41: aleatorio 90 id 42: aleatorio 90 id 43: aleatorio 96 id 44: aleatorio 34 id 45: aleatorio 47 id 46: aleatorio 89 id 47: aleatorio 97 id 48: aleatorio 58 id 49: aleatorio 78 id 50: aleatorio 49 id 51: aleatorio 23 id 52: aleatorio 82 id 53: aleatorio 12 id 54: aleatorio 92 id 55: aleatorio 51 id 56: aleatorio 99 id 57: aleatorio 56 id 58: aleatorio 9 id 59: aleatorio 14 id 60: aleatorio 1 id 61: aleatorio 4 id 62: aleatorio 80 id 63: aleatorio 80 id 64: aleatorio 97 id 65: aleatorio 89 id 66: aleatorio 47 id 67: aleatorio 3 id 68: aleatorio 73 id 69: aleatorio 34 id 70: aleatorio 99 id 71: aleatorio 22 id 72: aleatorio 38 id 73: aleatorio 69 id 74: aleatorio 22 id 75: aleatorio 6 id 76: aleatorio 97 id 77: aleatorio 28 id 78: aleatorio 47 id 79: aleatorio 21 id 80: aleatorio 50 id 81: aleatorio 89 id 82: aleatorio 22 id 83: aleatorio 71 id 84: aleatorio 98 id 85: aleatorio 45 id 86: aleatorio 20 id 87: aleatorio 12 id 88: aleatorio 29 id 89: aleatorio 75 id 90: aleatorio 11 id 91: aleatorio 54 id 92: aleatorio 24 id 93: aleatorio 86 id 94: aleatorio 89 id 95: aleatorio 90 id 96: aleatorio 39 id 97: aleatorio 34 id 98: aleatorio 1 id 99: aleatorio 37 id 100: aleatorio 66
Ya les dejo con ésto, espero que a alguien le sirva, un saludo.
Un día más, curioseando con mi Eclipse, probando a ver si ponía en marcha EGit para usar repositorios Git llego a encontrar un curioso proyecto que está llevando a cabo Pekka Enberg. Pekka es un ingeniero finlandés que dirige el Jato: a JIT-only virtual machine for Java. Que viene a ser un compilador de Java pero que va incluido como un módulo del Kernel de Linux.
Viene a ser una implementación «open source» de la máquina virtual de Java, dando soporte a la especificación Java SE Edición 7.
Antes de la versión 7 de Java, Linux no debía incluír la máquina virtual de Java en sus distribuciones. En la versión 7, lo que se ha hecho con Java principalmente es extraer de la máquina virtual las librerias propietarias, dejando sólo las librerías de las que se tiene el código fuente, que no son propietarias y son gratuitas, con lo que ya se puede usar la JVM como si de un programa GNU fuera, resumiendo a groso modo. Éste era un sueño que tenía Sun antes de su desaparición por ser absorbida por la macroempresa Oracle. Al final muchos propietarios de las librerías han liberado sus códigos y otros, reticentes, han sido excluidos de la versión 7 y reemplazados por otros. Ya hace tiempo de la primera versión de la JVM 7 pero es importante para ponerse en situación.
Java, como principal, o como uno de los principales lenguajes de programación, se está asentando fuertemente en el mundo Linux. Líder en la implantación de nuevos servidores, Linux está siendo una alternativa más que buena en los nuevos sistemas, y Java está afianzándose hasta la médula con éste «nuevo» módulo del kernel. A fecha en que escribo ya van tres años desde los primeros pasos del módulo, va por la versión 0.3. Les dejo unos enlaces para los más curiosos:
Volviendo de nuevo con un nuevo post sobre Swing, esta vez os dejo un componente un poco más complicado de entender, el JTree. Su uso con el Swing Designer es bien simple de ponerlo en un frame y dibujar su interfaz, pero cuando entremos en su estructura que tenemos para manejarlo necesitaremos tener conocimientos de lo que es un Tipo Abstracto de Datos (TAD para los amigos), y en concreto lo que es un árbol. Lo que se puede hacer y cómo se estructura internamente lo supongo por entendido. Si no es el caso mejor empezar por ver ésto, sino lo de a continuación puede convertirse en un jeroglífico.
Para éste tutorial he utilizado Eclipse Juno y la versión 7 update 9 del JDK. Lo primero es crear, dentro de Eclipse, en la ventana del explorador de proyectos, un nuevo proyecto de Java. Luego crear un nuevo JFrame con el asistente de Eclipse y ya tenemos el esqueleto del programa listo para empezar. Yendo al diseñador de formularios del Swing Designer le añades un Absolute layout al formulario para poder posicionar los componentes donde quieras del formulario, y entonces para éste ejemplo le he añadido dos botón y un componente JTree. El componente JTree está a su vez dentro de un JScrollPane para que se muestren las barras de scroll si el contenido es más grande que lo que se puede ver.
Antes de continuar te debe de haber quedado una ventana parecida a la de la imagen de inicio.
En la versión que tengo, cuando añado el JTree al Frame, se crea con un contenido sobre colores, deportes y comida. Éstos datos están en la propiedad model. De igual manera que algunos otros componentes, tenemos un modelo de árbol para usar el JTree. Por ejemplo, cuando usamos las listas tenemos modelos de listas, pues ahora son modelos de árbol. Si no establecemos el modelo, por defecto se construye con los elementos dichos. Vamos ahora con el TreeModel.
Creando el árbol
Vamos a usar dos tipos de datos para crear la estructura y ponerla en el JTree: el DefaultTreeModel y el DefaultMutableTreeNode.
El botón para cargar el árbol lo he puesto para leer el árbol de directorios de tu disco duro. El tipo de datos TreeModel es el objeto que tiene internamente el JTree para manejar su estructura en árbol, nosotros vamos a usar una clase derivada de ésta porque se trata de una interfaz que no podemos usar directamente. Entonces tenemos el DefaultTreeModel que va a ser el tipo que usaremos.
Por otro lado tenemos que en cada elemento de un DefaultTreeModel es un DefaultMutableTreeNode. De forma que cada nodo de éstos puede tener a su vez hijos, formando así un árbol según tenga hijos o no. Para entenderlo ésto he pensado usar el árbol de directorio que todos conocemos.
Antes de seguir, explicando las dos funciones del JTree, si queremos crear una estructura de tipo árbol como por ejemplo:
…lo que tenemos que hacer es que cada nodo es un elemento de tipo DefaultMutableTreeNode, y cada elemento se puede hacer hijo de otro. Es decir, lo único que hay que decirle al programa es de cada nodo cuál es su padre con la función insertNodeInto(nodo, padre, índice). Por ejemplo para la estructura anterior programaríamos:
DefaultMutableTreeNode nodoroot, nodo1, nodo11, nodo12, nodo2, nodo21, nodo22; nodoroot = new DefaultMutableTreeNode("Éste es el nodo principal."); nodo1 = new DefaultMutableTreeNode("nodo1"); nodo11 = new DefaultMutableTreeNode("nodo11"); nodo12 = new DefaultMutableTreeNode("nodo12"); nodo2 = new DefaultMutableTreeNode("nodo2"); nodo21 = new DefaultMutableTreeNode("nodo21"); nodo22 = new DefaultMutableTreeNode("nodo22"); arbol.setRoot(nodoroot); arbol.insertNodeInto(nodo1, nodoroot, 0); arbol.insertNodeInto(nodo2, nodoroot, 1); arbol.insertNodeInto(nodo11, nodo1, 0); arbol.insertNodeInto(nodo12, nodo1, 1); arbol.insertNodeInto(nodo21, nodo2, 0); arbol.insertNodeInto(nodo22, nodo2, 1);
En el ejemplo os he dejado algo más complicado, con una función recursiva que carga toda la estructura de directorios desde el directorio raiz «/». Es decir, cuando le damos al botón tenemos el código siguiente:
btnCargarrbolDe.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
DefaultTreeModel arbol = (DefaultTreeModel) tree.getModel(); DefaultMutableTreeNode nroot = new DefaultMutableTreeNode("Árbol de directorios");
… una vez dicho cual es el nodo principal (nroot), la función CargaEstructuraDirectorios lo hace todo. Puede tardar bastante, depende lo que tengas en tu ordenador o lo rápido que sea, déjalo ejecutarse hasta el final si lo quieres ver el resultado.
No voy a entrar en detalle sobre funciones recursivas o lectura de directorios. Lo que hay que saber es que lista un directorio, añadiendo todo lo que encuentra al árbol en su lugar adecuado, de maner que si encuentra un directorio lo añade también. Y acto seguido entra al directorio y lo lista, de manera que si algo de dentro también es un directorio vuelve a hacer lo mismo, es decir, vuelve a entrar en éste segundo directorio y lo lista también añadiendo de nuevo los elementos en el lugar adecuado. Así sucesivamente hasta listar todos los directorios y subdirectorios.
Todo ésto queda simple con una función recursiva que os dejo aquí:
Igual que se añaden nodos, también se pueden borrar. Usando la función removeNodeFromParent que se usa en el ejemplo. Con un botón simple. No sólo podemos borrar un nodo, también podemos borrarlo de un sitio y ponerlo en otro, reordenando nuestro árbol, modificándolo, o lo que necesitemos. Pero con añadir o borrar tenemos lo básico para empezar…
Click, empieza el juego
Ahora se complica, pero empieza el juego xD ¿cómo hacer algo cuando hacemos click en un elemento del árbol? Haciendo click derecho con el ratón en el JTree añadimos el capturador de eventos que vamos a usar para hacer álgo cuando el usuario hace click en el JTree:
Eclipse, de nuevo nos genera el código esqueleto siguiente:
final JTree tree = new JTree(); tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { DefaultMutableTreeNode nseleccionado = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); JOptionPane.showMessageDialog(frame, nseleccionado.getPath()); } });
Se pueden capturar otros eventos. Y bueno, ya la imaginación o lo que necesitemos entra en juego para desarrollar lo que necesitemos. Con las funciones principales que nos proporcina el DefaultMutableTreeNode pordemos hacer lo que queramos. Podemos tener varios árboles y ponerlos en el JTree cuando queramos uno u otro, podemos recorrer los nodos por los índices, podemos saber cuál es el nodo principal con la función .getRoot, saber cuántos hijos tiene un nodo con .getChildCount, etcétera…
No hay más que curiosear para qué sirven las funciones proporcionadas, como podemos ver en la imagen siguiente del Eclipse:
Hay que saber que cuando hacemos cambios en la estructura de árbol, éstos automáticamente se visualizan en el JTree, con lo que sólo tenemos que centrarnos en el árbol.
Para más información me remito de nuevo a la documentación oficial:
En el ejemplo he comentado algunas cosas más. Aquí están en descarga directa los códigos fuentes. Hay un .jar, para ejecutarlo necesitas el JRE instalado, si quieres modificarlo, sólo necesitas un editor de texto ya que sólo hay un fichero .java y recompilarlo.
Todo el código comentado es el siguiente para el que no quiera descargarlo:
// La clase principal public class Principal extends JFrame {
// el panel contenedor private JPanel contentPane; // el JFrame static Principal frame;
/** * esta es la función que primero se ejecuta creando el JFRame y visualizándolo */ public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { frame = new Principal(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); }
/** * la creación del JFrame principal donde está programado todo lo de éste ejemplo */ public Principal() { // título de ventana setTitle("Java Swing 8 El JTree by Jnj"); // operación al cerra el JFrame setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // dimensiones y posición en el escritorio setBounds(100, 100, 450, 306); // se crea el panel contentPane = new JPanel(); // los bordes contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); // se establece setContentPane(contentPane); contentPane.setLayout(null);
// se pone el botón en la ventana JButton btnCargarrbolDe = new JButton( "Cargar u00E1rbol de directorios"); btnCargarrbolDe.setBounds(10, 11, 200, 23); contentPane.add(btnCargarrbolDe);
// las barras de escroll para el JTree JScrollPane scrollPane = new JScrollPane(); scrollPane.setBounds(10, 45, 414, 206); contentPane.add(scrollPane);
// el JTree final JTree tree = new JTree(); // que captura el evento click tree.addTreeSelectionListener(new TreeSelectionListener() { public void valueChanged(TreeSelectionEvent e) { // se obtiene el nodo seleccionado DefaultMutableTreeNode nseleccionado = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent(); // visualiza el path del nodo JOptionPane.showMessageDialog(frame, nseleccionado.getPath()); } }); // se pone el árbol en el panel de las barras de scroll scrollPane.setViewportView(tree);
// aquí el botón que borra el último elemento de los primeros hijos // es decir, desde el nodo root, borra sólo el último hijo JButton btnBorrarltimoNodo = new JButton("Borrar u00FAltimo nodo"); btnBorrarltimoNodo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
DefaultTreeModel arbol = (DefaultTreeModel) tree.getModel(); DefaultMutableTreeNode padre = (DefaultMutableTreeNode) arbol.getRoot(); int numeroDeHijos = arbol.getChildCount(padre);
// borra el último hijo del padre arbol.removeNodeFromParent((MutableTreeNode) arbol.getChild( padre, numeroDeHijos - 1)); } }); btnBorrarltimoNodo.setBounds(220, 11, 204, 23); contentPane.add(btnBorrarltimoNodo);
// evento click del botón de carga del árbol // simplemente añade el nodo root y llama a la función de carga // para añadir todos los nodos hijos al nodo root btnCargarrbolDe.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent arg0) {
DefaultTreeModel arbol = (DefaultTreeModel) tree.getModel(); DefaultMutableTreeNode nroot = new DefaultMutableTreeNode( "Árbol de directorios");
arbol.setRoot(nroot);
CargaEstructuraDirectorios(arbol, nroot, "/");
} });
}
// función recursiva que lista todos los directorios y subdirectorios // a partir de una ruta, añadiéndolos a la estructura en árbol private void CargaEstructuraDirectorios(DefaultTreeModel arbol, DefaultMutableTreeNode padre, String ruta) { DefaultMutableTreeNode aux = null;
File archivo = new File(ruta); // puntero al directorio de la ruta File[] archivos = archivo.listFiles(); // lista todos los archivos de la ruta
// recorre lo que hay en la ruta if (archivos != null) { for (int i = 0; i < archivos.length; i++) {
// creando un nodo con cada cosa del directorio aux = new DefaultMutableTreeNode(archivos[i].getName()); // inserta el nodo hijo arbol.insertNodeInto(aux, padre, i);
// si encontramos un directorio volvemos a hacer lo mismo con sus hijos if (archivos[i].isDirectory()) { try {
// llamando recursivamente de nuevo a ésta misma función CargaEstructuraDirectorios(arbol, aux, archivos[i].getAbsolutePath() + "/");
} catch (Exception e) { System.out.println(e.getMessage()); // por si acaso le he puesto un try xD } }