03Mar
Algunas noticias que había dejado en el tintero, mientras sacaba tiempo... una que me ha sorprendido bastante es el el cierre de Stage6.
Acerca de Java y programación... la primera pseudo-noticia es que OpenJDK 6 publica su primera entrega de código, un proyecto que pretende tener una versión libre de JDK 6 basada en el código de la versión 7 que Sun ha publicado con anterioridad. Puedes descargarte el código fuente o la versión ya compilada y lista para usarse en linux, solaris o windows. Además, se ha lanzado un nuevo número del Podcast de javaHispano.
Con respecto a Gnu/Linux, en oBux se habla acerca de un eBook de Ingeniería del Software en entornos de SL. En DiarioLinux nos enseñan un tip para matar todos los procesos de un tiro. En HowtoForgenos muestran cómo verificar si tu servidor Debian está infectado con Linux/Rst-B.
En LinuxFeatures, Ejecutar Debian Gnu/Linux desde un pendrive USB encriptado. Además, nuestro amigo S@mutops de La Ventana Muerta nos recomienda Lincudo.org, un directorio de paquetes para Ubuntu.
En VivaLinux se hablaba sobre la velocidad de respuestas al exploit local contra el Kernel 2.6.
Para la gentoosa Linuxera: Ver dependencias en Gentoo
A través UbuntuTips me entero del nuevo número de la revista RevistaSL #10. Y en el blog de Magarto: Recuperar datos en GNU/Linux (ext3)
En Mundogeek nos ofrecen los resultados de las estadísticas en LinuxQuestions.org acerca de lo mejor del 2007, mientras que en el excelente blog de NeoDave me informo que, Canonical se lanza al mundo del móvil, con Ubuntu Mobile. Y en el Blux 2.0 comentan una herramienta llamada OpenXML Translator, que te permite abrir, guardar y convertir documentos de Word 2007 en OpenOffice.org.
El lanzamiento de Ubuntu Brainstorm es sin duda una de las noticias más comentadas en los blogs Ubunteros.
Espero no se me queda nada. Un saludo, y disculpas por el abandono
03Mar
Siguiendo con el tema de redes en Java, veremos el uso de la clase JEditorPane, la cual podremos usar cuando el uso de JTextArea no sea suficiente, y necesitemos un area de texto en el que podamos incluir textos en distintos colores o hasta imágenes.
JEditorPane puede interpretar texto HTML, por lo que podremos mostrar contenidos de una página u otro recurso que utilice este estándar. Por tanto, veremos además como procesar eventos HyperlinkEvent para la manipulación de links.
El resultado...

El código...
// Uso de un objeto JEditorPane para mostrar el contenido de un archivo en un servidor Web.
import java.awt.*;
import java.awt.event.*;
import java.net.*;
import java.io.*;
import javax.swing.*;
import javax.swing.event.*;
public class LeerArchivoServidor extends JFrame {
private JTextField campoIntroducir;
private JEditorPane areaContenido;
// configurar GUI
public LeerArchivoServidor()
{
super( "Navegador Web simple" );
Container contenedor = getContentPane();
// crear campoIntroducir y registrar su componente de escucha
campoIntroducir = new JTextField( "Escriba aquí el URL del archivo" );
campoIntroducir.addActionListener(
new ActionListener() {
// obtener el documento especificado por el usuario
public void actionPerformed( ActionEvent evento )
{
obtenerLaPagina( evento.getActionCommand() );
}
} // fin de la clase interna
); // fin de la llamada a addActionListener
contenedor.add( campoIntroducir, BorderLayout.NORTH );
// crear areaContenido y registrar componente de escucha de evento HyperlinkEvent
areaContenido = new JEditorPane();
areaContenido.setEditable( false );
areaContenido.addHyperlinkListener(
new HyperlinkListener() {
// si el usuario hizo clic en el hipervínculo, ir a la página especificada
public void hyperlinkUpdate( HyperlinkEvent evento )
{
if ( evento.getEventType() ==
HyperlinkEvent.EventType.ACTIVATED )
obtenerLaPagina( evento.getURL().toString() );
}
} // fin de la clase interna
); // fin de la llamada a addHyperlinkListener
contenedor.add( new JScrollPane( areaContenido ),
BorderLayout.CENTER );
setSize( 400, 300 );
setVisible( true );
} // fin del constructor de LeerArchivoServidor
// cargar documento
private void obtenerLaPagina( String ubicacion )
{
// cargar documento y mostrar ubicación
try {
areaContenido.setPage( ubicacion );
campoIntroducir.setText( ubicacion );
}
catch ( IOException excepcionES ) {
JOptionPane.showMessageDialog( this,
"Error al recuperar el URL especificado", "URL incorrecto",
JOptionPane.ERROR_MESSAGE );
}
} // fin del método obtenerLaPagina
public static void main( String args[] )
{
JFrame.setDefaultLookAndFeelDecorated(true);
LeerArchivoServidor aplicacion = new LeerArchivoServidor();
aplicacion.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
}
} // fin de la clase LeerArchivoServidor
Descargar código fuente
02Mar
Introduciendonos de manera breve al tema de redes en Java, veamos un pequeño ejemplo de manipulación de URLs desde los Applets. Si se utiliza una URL que haga referencia a una página Web en concreto como un argumento para el método showDocument de la interfaz AppletContext, el navegador en el que se ejecuta el Applet mostrará el recurso URL especificado.
Además, en el Applet que desarrollaremos más adelante, se utilizará una forma de paso de parametros, especificados dentro del documento HTML que invoca al Applet. Esto es muy útil puesto que permite a los Applets ser más dinámicos, y nos ofrece posibilidades para crear RIAs básicas.
El resultado...
El código...
Veamos el archivo HTML que invocará el Applet, y nota cómo se declaran parámetros que serán utilizados desde el programa:
<html>
<title>Selector de sitios</title>
<body>
<applet code = "SelectorSitios.class" width = "300" height = "100">
<param name = "titulo0" value = "UbuntuLife">
<param name = "ubicacion0" value = "http://ubuntulife.net/">
<param name = "titulo1" value = "El blog de Casidiablo">
<param name = "ubicacion1" value = "http://casidiablo.net/">
<param name = "titulo3" value = "elhacker.net">
<param name = "ubicacion3" value = "http://www.elhacker.net/">
<param name = "titulo4" value = "hac.kers">
<param name = "ubicacion4" value = "http://hac.kers.net/">
<param name = "titulo5" value = "NPC">
<param name = "ubicacion5" value = "http://nopuedocreer.com/">
<param name = "titulo7" value = "Malaciencia">
<param name = "ubicacion7" value = "http://malaciencia.info/">
</applet>
</body>
</html>
El documento HTML posee 12 etiquetas param; éstas deben estar siempre entre las etiquetas de apertura y de cierre del Appelt. El Applet puede leer estos valores y utilizarlos dentro del programa Java. Cada etiqueta param posee dos datos: un nombre y un valor. El método getParameter de Applet recupera el valor asociado con un nombre específico, y devuelve el valor como una cadena. El argumento que se le pasa a getParameter es el nombre del parámetro que se quiera recuperar. En este caso los parametros contienen información del nombre y URL de ciertos sitios web que el usuario puede seleccionar del JList.
El siguiente Applet (SelectorSitios.java) usa los métodos mencionados, y a partir de los datos obtenifos genera un objeto JList en donde el usuario puede seleccionar una página Web. La clase SelectorSitios utiliza un objeto HashMap (paquete java.util), para almacenar los nombres y URL de los sitios (un objeto HashMap almacena pares clave/valor):
// Este programa utiliza un botón para cargar un documento a partir de un URL.
import java.net.*;
import java.util.*;
import java.awt.*;
import java.applet.AppletContext;
import javax.swing.*;
import javax.swing.event.*;
public class SelectorSitios extends JApplet
{
private HashMap sitios; // nombres y URLs de los sitios
private Vector nombresSitios; // nombres de los sitios
private JList selectorSitios; // lista de sitios a elegir
// leer parámetros de HTML y configurar GUI
public void init()
{
// crear HashMap y Vector
sitios = new HashMap();
nombresSitios = new Vector();
// obtener los parámetros del documento HTML
obtenerSitiosDeParametrosHTML();
// crear componentes de GUI y preparar distribución de la interfaz
Container contenedor = getContentPane();
contenedor.add( new JLabel( "Seleccione un sitio para navegar" ),
BorderLayout.NORTH );
selectorSitios = new JList( nombresSitios );
selectorSitios.addListSelectionListener(
new ListSelectionListener() {
// ir al sitio que seleccionó el usuario
public void valueChanged( ListSelectionEvent evento )
{
// obtener nombre del sitio seleccionado
Object objeto = selectorSitios.getSelectedValue();
// usar nombre del sitio para localizar URL correspondiente
URL nuevoDocumento = ( URL ) sitios.get( objeto );
// obtener referencia al contenedor de subprogramas
AppletContext navegador = getAppletContext();
// indicar al contenedor de subprogramas para cambiar de página
navegador.showDocument( nuevoDocumento );
}
} // fin de la clase interna
); // fin de la llamada a addListSelectionListener
contenedor.add( new JScrollPane( selectorSitios ),
BorderLayout.CENTER );
} // fin del método init
// obtener parámetros del documento HTML
private void obtenerSitiosDeParametrosHTML()
{
// buscar parámetros del subprograma en documento HTML y agregarlos a HashMap
String titulo, ubicacion;
URL url;
int contador = 0;
titulo = getParameter( "titulo" + contador ); // obtener título del primer sitio
// iterar hasta que no haya más parámetros en el documento HTML
while ( titulo != null ) {
// obtener ubicación del sitio
ubicacion = getParameter( "ubicacion" + contador );
// colocar titulo/URL en HashMap y titulo en Vector
try {
url = new URL( ubicacion ); // convertir ubicacion a URL
sitios.put( titulo, url ); // colocar titulo/URL en HashMap
nombresSitios.add( titulo ); // colocar titulo en Vector
}
// procesar formato incorrecto de URL
catch ( MalformedURLException excepcionURL ) {
excepcionURL.printStackTrace();
}
++contador;
titulo = getParameter( "titulo" + contador ); // obtener título del siguiente sitio
} // fin de instrucción while
} // fin del método obtenerSitiosDeParametrosHTML
} // fin de la clase SelectorSitios
Descargar código fuente