jueves, 28 de octubre de 2010

Cambio de blog

Hola,
he decidido mudarme a un nuevo servicio de blogging, podrás encontrarme en:

http://franciscoguemes.wordpress.com

En los días sucesivos a esta entrada iré pasando las distintas entradas de un sitio a otro, para después continuar editando en el nuevo sitio.
Saludos.

domingo, 10 de octubre de 2010

Comparar dos vectores

Suponiendo el caso de que se tienen dos vectores (a1 y a2) de int, boolean, double, float, long, char, byte e incluso Object, la forma mas rápida de comparar estos dos array en Java es:

java.util.Arrays.equals(a1,a2);

Esta simple línea de código evita métodos static (o posibles códigos duplicados) similares al siguiente:



/**
* Comprueba que los dos array de double contienen exáctamente los mismos
* valores, y por tanto son iguales.
*
* @param a1 Primer array de números reales.
* @param a2 Segundo array de números reales.
* @return Verdadero si los array son iguales. Falso en caso contrario.
*/
private boolean compareArray(double [] a1, double [] a2){
boolean equals = false;
if(a1.length == a2.length){
int emembers =0;
for(int i=0 ; i < a1.length ; i++){
if(a1[i] == a2[i])
emembers++;
}
if(emembers == a1.length)
equals=true;
}
return equals;
}

sábado, 9 de octubre de 2010

Leer de la línea de comandos

Leer una entrada del usuario de la línea de comandos en Java a priori no es tan intuitivo como puede ser en C o C++.En Java existen 2 opciones para llevar esto a cabo.

Usando streams
Es la forma mas extendida, se usa el flujo de entrada por defecto (System.in),el cuál se recubre creado un InputStreamReader (transforma los bytes en caracteres) y este último se usa para construir un flujo de entrada con buffer.


BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
try {
String line = in.readLine();
} catch (IOException e) {
//Hacer lo que sea si falla...
e.printStackTrace();
}


Usando la clase Console
Esta opción no es tan extendida. Se usa la clase Console, la cuál por debajo hace uso de streams. Esta forma es muy similar a como se haría en C#.

java.io.Console c = System.console();
String name = c.readLine();


El método console de la clase System puede retornar null si el sistema operativo no tiene una consola asociada o porque no permite este tipo de operaciones (esto se suele dar en hardware básico, teléfonos móviles, router, etc ...), o bien porque se está lanzando la aplicación desde un entorno no interactivo como puede ser un IDE (Eclipse,NetBeas, etc...).

Apariencia de un JFrame

La problemática no es crear un JFrame, ya que cualquier programador sabe crear una clase que herede de JFrame. El problema es que la nueva ventana tenga la apariencia deseada. Así que en el siguiente ejemplo se recogen unas cuantas líneas de código típicas a la hora de cambiar el aspecto que tiene por defecto un JFrame:


public class MainFrame extends JFrame {

MainFrame(){
this.setTitle("Mi ventana Java");

//Fija el tamaño de la ventana
this.setSize(300,300);

//Cambia el icono de la taza de café
this.setIconImage(new ImageIcon("mi_imagen.png").getImage());

//Hace que la ventana no se pueda redimensionar
this.setResizable(false);

//Hace que la ventana aparezca centrada en la pantalla
this.setLocationRelativeTo(null);

}
}


Otras opciones que pueden resultar interesantes

Dimensionar la ventana al tamaño de la pantalla:
Hacer que la ventana tenga el mismo tamaño que la pantalla en la que va a aparecer:

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
this.setSize(screenSize);


Maximizar la ventana:
Es decir que la ventana aparezca de entrada ya maximizada en la pantalla.

this.setExtendedState(JFrame.MAXIMIZED_BOTH);


Quitar el marco de la ventana:
Quita el marco en el que aparece el título de la ventana y los botones de minimizar, maximizar y cerrar la ventana:

this.setUndecorated(true);

Ajustar la ventana:
Hacer que toda la jerarquía de componentes contenidos en la ventana, se vaya ajustando a sus respectivos tamaños, partiendo del tamaño de la ventana. (Produce una serie de llamadas en cascada al método pack de cada componente contenido en la ventana). Este método siempre debe ser el último en ser llamado en el constructor del JFrame personalizado que se esté creando.

this.pack();


Mostrar el JFrame
Finalmente para que el JFrame sea visible, hay que invocar el método setVisible. Una buena práctica es invocar este método en la línea de código siguiente a la instanciación del objeto derivado de JFrame. De esta forma se evitan posibles errores lógicos en el constructor de la clase implementada, ya que algunas llamadas a determinados métodos no tienen efecto una vez que la ventana es visible. En el siguiente ejemplo se ha creado una clase llamada StartPoint que será el punto de comienzo de la aplicación.

public class StartPoint {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
MainFrame mf = new MainFrame();
mf.setVisible(true);
}
});
}
}

jueves, 7 de octubre de 2010

Quitar el encabezamiento / pie de página en Calc

Para quitar el pie de página en OpenOffice Calc hay que seguir los siguientes pasos:
  1. Ir al menú Formato
  2. Seleccionar la opción Página
  3. En la ventana emergente seleccionar la pestaña Pie de página
  4. Activar/desactivar la casilla correspondiente.
Para activar/desactivar el encabezamiento hay que seguir los mismos pasos, pero en el paso 3, seleccionar la pestaña Encabezamiento.
Con esto se consigue evitar (o forzar) que el programa imprima por defecto el número de página y de hoja, o cualquier otro encabezado o pié de página que el usuario haya podido configurar.

miércoles, 6 de octubre de 2010

Números aleatorios

Para crear un número aleatorio en Java (mejor dicho pseudoaletorio, ya que siendo purista, hay que matizar que la aleatoriedad como tal, no existe en la informática) lo mas sencillo es usar la siguiente sentencia de código:

double randomNumber = java.lang.Math.random();

Esto creará un double comprendido en el intervalo [0,1).
Si lo que interesa es crear un número comprendido dentro de otro rango, por ejemplo [a,b] entonces se puede usar una expresión del tipo:

randomNumber = (randomNumber +1) * (b-a) + a-2;

o lo que es lo mismo:

randomNumber = randomNumber * (b-a) + b - 2;

Aunque nunca se llegará realmente a conseguir el número b, si se conseguirán valores muy próximos. Este tipo de expresiones solían hacerse en programación C.
Java ofrece una forma alternativa de obtener un número real en el rango [0,1), esta forma es creando una instancia de la clase java.uti.Random:

java.util.Random r = new java.util.Random();
double randomNumber = r.nextDouble();

La principal ventaja de usar la case Random es que tiene unos cuantos métodos para generar números pseudoaletarios de distintos tipos. Entre estos métodos cabe destacar el constructor parametrizado de la clase y el método nextInt:

long seed = 1001;
java.util.Random r = new java.util.Random(seed);
int integer = r.nextInt(10);

El número 1001 (valor arbitrario de la variable seed) es la semilla del generador de números pseudoaleatorios. Esta semilla determinará la secuencia de números aleatorios a producir (solo para números enteros). El método nextInt generará números enteros comprendidos en el rango [0,9].

martes, 5 de octubre de 2010

Caracter separador de directorios

Si se desarrollan aplicaciones Java, que pretendan ser multiplataforma, y estas aplicaciones acceden a distintos recursos de sistema (ficheros, dispositivos, etc ...), usando rutas relativas o bien absolutas, dependiendo de en que plataforma se ejecute la aplicación, el carácter separador de directorios cambiará dependiendo del sistema operativo anfitrión.

En Windows será el Backslash "\" y en linux/Unix será el Slash "/". Con el fin de evitar porciones de código específicas para cada sistema (como lo visto en la anterior entrada: Averiguar el Sistema Operativo Anfitrión), Java trae de serie la posibilidad de ahorrar este trabajo sucio al programador mediante cualquiera de estos códigos:

char c = java.io.File.separatorChar;
String s = java.io.File.separator


El primero devuelve el separador como un tipo de dato char, y el segundo como un objeto String.

viernes, 1 de octubre de 2010

Averiguar el Sistema Operativo Anfitrión

Para averiguar el sistema operativo anfitrión basta con ejecutar la siguiente línea de código:

String os = System.getProperty("os.name");

El contenido de la cadena "os" puede ser:
  • AIX
  • Digital Unix
  • FreeBSD
  • HP UX
  • Irix
  • Linux
  • Mac OS
  • Mac OS X
  • MPE/iX
  • Netware 4.11
  • OS/2
  • Solaris
  • Windows 2000
  • Windows 7
  • Windows 95
  • Windows 98
  • Windows NT
  • Windows Vista
  • Windows XP
Con lo cuál el programa puede elegir que hacer, si es que hay alguna parte específica que dependa del sistema operativo anfitrión:

if(os.startsWith("Windows")){
//Hacer lo que sea ...
}else{
//Ya se sabe que el sistema no es de la familia Windows ...
//Hacer lo que corresponda
}