Bienvenido a Java Mexico

Java México es una comunidad de desarrolladores mexicanos en el lenguaje Java.

Este sitio es colaborativo, automáticamente al registrarte obtienes un Blog para compartir tus conocimientos o información acerca del lenguaje. Antes de publicar en tu blog o los foros por favor lee los lineamientos de publicación.

Para dudas y problemas con respecto al lenguaje Java puedes visitar los Foros de Discusión.

También puedes responder nuestra encuesta para saber en que estado vives!

Diferencia entre dos fechas (Java 8)

 

¿Recuerdas un evento importante pero no recuerdas qué edad tenías? ¿Quieres saber cuánto tiempo ha transcurrido entre dos fechas? ¿No quieres lidiar con java.util.Calendar?

En ese caso, tal vez quieras usar Date and Time API (Java 8). Ejemplo:

import static java.time.temporal.ChronoUnit.*;

import java.time.chrono.ChronoLocalDate;
import java.time.chrono.ChronoPeriod;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        ChronoLocalDate from = ChronoLocalDate.from(formatter.parse("01/01/2000"));
        ChronoLocalDate to = ChronoLocalDate.from(formatter.parse("01/01/2015"));
        ChronoPeriod period = ChronoPeriod.between(from, to);
        System.out.printf("%d años, %d meses y %d días", period.get(YEARS), period.get(MONTHS), period.get(DAYS));
    }
}

Ver demo en línea.

¡Por si sirve de algo!

Login con Facebook parte 1

******************************

Aquí pueden ver la segunda parte del tutorial: Login con Facebook parte 2 http://paraisodeldesarrollador.blogspot.mx/2015/04/login-con-facebook-pa...

******************************

En estos tiempos son cada vez más los sitios web en los que te permiten realizar la autenticación por medio de redes sociales siendo Facebook la más usada para tal fin, en este pequeño tutorial vamos a realizar la conexión para poder autenticarnos a una aplicación externa con nuestra cuenta de Facebook.

Al momento de la realización del tutorial ocupamos las siguientes versiones: Grails 2.4.4 y Java 1.7

Crearemos un nuevo proyecto exclusivamente para este ejemplo, en el, lo primero que debemos realizar es la instalación y configuración de Spring Security Core, una opción es como lo muestro aquí (Configurar Spring Security Core Plugin).
Este tutorial lo vamos a dividir en dos partes, esta primera, la cual consta de las configuraciones que debemos realizar en Facebook para dejar “lista” una aplicación para poder loguearnos y la segunda que tratara sobre el código en nuestra aplicación para enlazar el formulario de login de Facebook.

Creando una nueva aplicación en Facebook

1.- Entrar a la url https://developers.facebook.com, la cual al momento de realizar este tutorial muestra lo siguiente:

Inicializadores (Inicializadores de Instancia)

Continuando con el post anterior sobre bloques estáticos, pero ahora toca definir los usos, ventajas y desventajas de los inicializadores tambíen conocidos como "inicializadores de instancia", como se puede deducir estos bloques están dedicados para colocar bloques de código para inicializar variables que pertenezcan a la instancia.

Los inicializadores de instancia son bloques de código que pertenecen a la instancia, y se declaran dentro de la clase entre llaves como a continuación se muestra en el siguiente código:

package com.ejemplos.inicializadores;

public class Ejemplo1 {

        {
                System.out.println(this.getClass().getSimpleName());
        }

        Ejemplo1() {
                System.out.println("Constructor");
        }

        public static void main(String[] args) {
                new Ejemplo1();
        }

        {              
                System.out.println(this.getClass().getName());
        }

        {
                System.out.println(this.getClass().getSuperclass());
        }

}

Salida:

Ejemplo1
com.ejemplos.inicializadores.Ejemplo1
class java.lang.Object

Constructor

Obtener el Valor seleccionado de im combo BOx

Hola que tal amigos de java México saben tengo una pregunta.
¿Como obtener el id del item seleccionado?

 @Override
    public void itemStateChanged(ItemEvent e) {
        if (e.getSource() == viEva.cbArea) {
            viEva.cbAspecto.removeAllItems();
           
            String selec =viEva.cbArea.getSelectedItem().toString();
            Object obj = viEva.cbArea.getSelectedItem();
           // System.out.println("ID "+ obj.);
           String slq = "SELECT IdAspecto, Aspecto FROM Aspecto JOIN Area ON Aspecto.IdArea = Area.iDarea WHERE Area='" + selec + "';";

            viEva.cbAspecto.setModel(md.LlenarIndiceCombos(slq));
        }

    }

el debugear veo que la variable

obj

tiene las propiedades de valor y de id, pero no encuentro la manera de como acceder a esas propiedades.
el metodo con el que lleno los combos es el siguiente

public DefaultComboBoxModel llenarComboIndiceValor(String sql) {
        result = consultarSQL(sql);
        modeloCombo = new DefaultComboBoxModel();
        int cont = 0;
        String col[]= new String[2];
        try {

Comunicación asíncrona entre procesos Java

En este post de jpaul estuve comentando acerca de algunas de las broncas de RMI, y de cómo hay opciones más eficientes para cuando se necesita implementar comunicación eficiente entre dos aplicaciones Java, usando algo similar a RMI.

Primero que nada, quiero mostrar cuál es el problema concreto con RMI: cada llamada que se recibe en la aplicación que publica el componente, se hace en un hilo separado. Para demostrar esto, tomé el ejemplo original y lo modifiqué un poco: El servidor tarda un poco de tiempo, y también imprime el nombre del hilo actual y el número total de hilos activos:

Random rng = new Random(System.currentTimeMillis())

Remote stub = UnicastRemoteObject.exportObject(new TestRemote() {
  @Override
  public String sayHello(String name) throws RemoteException {
    println "Corriendo en ${Thread.currentThread().name} total ${Thread.activeCount()}"
    if(rng.nextBoolean())Thread.sleep(10)
    return "Hello, " + name;
  }
}, 0);
def registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
registry.bind("Test", stub);
println "Escuchando..."

Bloques estáticos

Hace poco tuve una conversación con un amigo acerca del uso de bloques estáticos y pues sabíamos muy poco de ellos, dicha platica nos hizó investigar más sobre el tema, lo cual originó que escribierá sobre usos, ventajas y desventajas de los bloques estáticos:

Primero toca definir que es un bloque estático: también conocido como inicializador estático es aquel bloque de código que pertenece a una clase o interface y se define entre llaves de código precedidas por la palabra reservada static como se presenta el siguiente fragmento de código:

    public class Ejemplo{

         static int numero;        

         static{
             System.out.println("Esto se imprime dentro de un bloque estático o inicializador estático");
             numero = 10;
         }
         
        public static void main(String [] args){
             
        }
    }

Varianza en Ceylon

Bueno pues después del artículo maratónico acerca de varianza en Java, ahora quiero explicar cómo se implementó esto en Ceylon. Para ello vamos a usar los mismos ejemplos, de modo que quede clara la comparación.

Lo primero son las tres clases para el ejemplo, y la primera función:

class A() {}
class B() extends A() {}
class C() extends B() {}

B f(B param) => C();

Hasta aquí, todo funciona exactamente igual que en Java:

B algo;
A a = f(algo); //OK
B b = f(algo); //OK
C c = f(algo); //Error

f(A()); //ERROR
f(B()); //OK
f(C()); //OK

En Ceylon también existe la covarianza en los tipos de retorno, similar a lo que se introdujo en Java 5:

class Padre() {
  shared default A metodo() => A();
}
class Hijo() extends Padre() {
  shared actual C metodo() => C();
}

Con los parámetros no se puede hacer algo similar. Ceylon no tiene sobrecarga de métodos, pero no tiene contravarianza en los parámetros; por lo tanto, al refinar un método de un supertipo, los parámetros deben ser exactamente del mismo tipo que en la declaración original, o el compilador emite un error.

Varianza, Covarianza y Contravarianza

En los sistemas de tipado estático, existe este concepto de varianza, que a veces puede entenderse muy fácil pero tampoco es tan intuitivo como parece.

Para ilustrar la varianza, vamos a definir una jerarquía de clases muy simple:

public class A {}
public class B extends A {}
public class C extends B {}

Y definimos un método o función que usa estos tipos:

public B f(B param) {
   //Qué puede devolver?
}

Primero que nada, viéndolo desde fuera, ¿A qué tipo de variables podemos asignar lo que devuelve esta función?

B algo;
A a = f(algo);
B b = f(algo);
C c = f(algo);

Las primeras dos líneas son correctas, la tercera da un error. Esto es porque la función devuelve un valor de tipo B, y B es también un A. Pero no podemos asignar a una subclase de B, al menos no sin hacer un cast, pero no vamos a hacer casts en esta ocasión. B no es un C, por lo tanto la tercera línea no compila.

Hasta aquí todo bien. Ahora, ¿Qué le podemos pasar como argumento a esta función? Tiene un solo parámetro de tipo B. En esta ocasión, es alrevés:

f(new A()); //ERROR
f(new B()); //OK
f(new C()); //OK

Buscar información en una base de datos y mostrarla en una tabla de tu formulario

Pool metodospool = new Pool();
DefaultTableModel ModeloTabla;
   

public void Buscar(String valor, String filtro, JTable tablacontactos){

    String [] columnas={"ID","Nombres","Apellidos","Email","Celular", "Dirección", "Ciudad"};
    String [] registro=new String[7];
    ModeloTabla=new DefaultTableModel(null,columnas);
    String SSQL;
    Connection conect = null;

 
    if(filtro.equals("Apellidos")){
   
        SSQL= "SELECT id_contacto, nombres, apellidos, email, celular, direccion, ciudad "
              + "FROM contacto WHERE apellidos LIKE '%"+valor+"%'";
       
    }else if(filtro.equals("Email")){
   
        SSQL= "SELECT id_contacto, nombres, apellidos, email, celular, direccion, ciudad "
              + "FROM contacto WHERE email LIKE '%"+valor+"%'";
   
    }else{
   
        SSQL= "SELECT id_contacto, nombres, apellidos, email, celular, direccion, ciudad "
              + "FROM contacto WHERE celular LIKE '%"+valor+"%'";
   
    }
   
           
     
    try {

        conect = metodospool.dataSource.getConnection();
        PreparedStatement st = conect.prepareStatement(SSQL);

JNI (Java Native Interface) Invocar una función en C desde Java Linux

Explicaremos lo mas breve posible la configuracion e instalacion invocando una funcion en C desde Java en este caso lo aremos con el sistema operativo Linux, el famoso Hola mundo bueno; empezemos con la explicacion:

  • Primeramente Verificamos la version de Java que tenemos instalado
  • @kali:~$ java -version
    java version "1.6.0_34"
  • Posteriormente creamos nuestra clase Java
  • public class HolaMundo {
           
            public HolaMundo(){
              System.out.println("\n Iniciando el constructor ...");       
            }
           
            public void FuncionSimple(String str){
                   
                    System.out.println("Funcion Simple ="+ str);
            }
           
            public static void FuncionEstatica(String str){
                    System.out.println("Iniciando una funcion metodo statico="+str);
            }
           
           
            public static void main(String[] args) {
                    HolaMundo obj =new HolaMundo();
                    obj.sampleFunc("Hola Bienvenido Invocando Funcion de C desde Java");
                    System.out.println("\n Llamando una funcion....");
                   
            }

    }

  • Compilamos la clase Java HolaMundo
  • javac HolaMundo.java
  • Creamos el Header de C
  • Distribuir contenido