Páginas

30/8/16

JScrollBar y JTextArea SWING, scroll arriba.

JScrollBar y JTextArea SWING, scroll arriba, después de agregar un texto setear el Scroll al principio.




Un pequeño Dato Java, hay un problemita que ocurre cuando estamos trabajando con Swing, específicamente con el JScrollBar y JTextArea. Supongamos que a este JTextArea al presionar un botón le seteamos un texto grande el cual hace que por default el scroll baje y para visualizar el contenido desde el principio tenemos que subir el scroll, bueno ese comportamiento no es el adecuado ya que es fastidioso tener que mover el scroll hacia arriba para visualizar el contenido.

Para solucionar ese problema y que el scroll del JTextArea siempre este arriba solo tenemos que setear esto:
  JTextArea.setCaretPosition(0);
   

Pequeños datos que pueden ahorrarte un montón de tiempo. Suerte!!

11/8/16

Que es un HashSet y cómo funciona

Que es un HashSet y cómo funciona.

Que es un HashSet y cómo funciona.




Siguiendo un poco con la temática de la Collection framework, este es un topic muy interesante, como ya sabemos hay varias interfaces en este framework, el HashSet es una de las implementaciones de la
SetForma parte de la Collection framework y básicamente lo que quiere decir es que en un Set solo puede existir un objeto, no pueden haber objetos repetidos.
interface. Para crear un HashSet solo tenemos que hacerlo de esta manera:
     // Un HashSet simple de String
  HashSet<String> hashSet = new HashSet<String>();
   
Simple no, bueno detrás de ese código, si vamos un poco más allá podemos ver que el código de ese constructor es así:
 public HashSet() {
        map = new HashMap<>();
    }
 
 //Donde "map" esta declarado asi
 HashMap<E,Object> map;
   
Aquí ya vemos que algo está un poco extraño, sorpresa, como es que un HashSet que implementa la interface Set en su implementación tiene un HashMap que implementa la interface Map?? Bueno algo muy sencillo, como les venía diciendo al principio del articulo un HashSet no permite objetos repetidos y los ingenieros de Java para asegurarse de que no pudiéramos ingresar objetos repetidos decidió utilizar un HashMap internamente el cual tampoco permite objetos repetidos, por que lo hicieron así?? Porque pueden, es algo confuso, pero funciona muy bien y reutilizan el código.

Deberías leer: Que es un HashMap y como funciona.

Una vez creado el HashSet, vamos a comentar un poco sus métodos mas importantes, supongamos que queremos agregar un conjuntos de personas al HashSet, lo hacemos así:
  hashSet.add("Pedro");
  hashSet.add("Pepe");
  hashSet.add("Luis");
  
  System.out.println("HashSet= " + hashSet);
    
Si corremos el ejemplo veremos la salida en la consola:
  HashSet= [Pedro, Pepe, Luis]
    
Si analizamos el método add(), vemos que este es su código:
  public boolean add(E e) {
   return map.put(e, PRESENT)==null;
  }
  
  // Donde "PRESENT" es 
  Object PRESENT = new Object();
    
Este método devuelve un boolean, si el objeto se agrega al HashSet devuelve true si no false, como ya sabemos, internamente esto funciona como un HashMap, cuando agregamos un objeto en un HashMap si ese objeto ya está agregado devuelve el valor anterior de esa key pero si el objeto no está y se agrega al HashMap devuelve null, entonces lo que hace el método add() es evaluar que devuelve y así se sabe si agrega o no el objeto. Podemos utilizar el boolean que devuelve el método para ejecutar algún código, por ejemplo:
  boolean b = hashSet.add("Luis");
  if(b){
   // Se agrego correctamente 
   
   // code
  
  }else{
   // Ya esta en el HashSet
   
   // code
  }
    
Como ya "Luis" está en el HashSet el metodo add() devuelve false y podríamos hacer algo en ese caso.
Si necesitamos eliminar un objeto del HashSet lo hacemos así:
  hashSet.remove("Luis");
  
  // Codigo del metodo remove()
  public boolean remove(Object o) {
   return map.remove(o)==PRESENT;
  }
    
La misma teoría del método add().
Como obtener un objeto del HashSet? Si estás acostumbrado a utilizar ArrayList, HashMap, Arrays puedes asumir que también se puede obtener un determinado objeto de un HashSet y no es así, el HashSet no posee un método para obtener un determinado objeto. Según mi punto de vista esto no es que este mal porque puedes resolverlo de varias maneras, en realidad no es necesario un metodo get(), de la manera más sencilla desde mi punto de vista sería así:
  if(hashSet.contains("Pepe")){
   // Se supone que si esta el objeto y podriamos sustituir el metodo get()
   
   // code
  }
    
Preguntando si un determinado objeto está en el HashSet podríamos sustituir el método get() ya que asumiríamos que el objeto si esta. También podemos iterar el HashSet de esta manera:
     for (Iterator<String> iterator = hashSet.iterator(); iterator.hasNext();) {
         String nombre = iterator.next();
         if (nombre.equals("Pedro")){
          // code
         }
     }
    
Esta manera también es válida pero gasta más recursos en comparación con el método contains(). Otra manera puede ser pasando el HashSet a un ArrayList:
     ArrayList<String> arrayList = new ArrayList<String>(hashSet);
     String nombre = arrayList.get(2);
    
También es válida pero sigo quedándome con la primera opción.
Caracteristicas del HashSet:
  • Solo almacena objetos.
  • No permite objetos duplicados.
  • Solo permite un objeto null
  • Implementa la Set interface.
  • No garantiza ningún tipo de orden al insertar los objetos.
  • Es un wrapper de HashMap.
Ese es básicamente el funcionamiento del HashSet, tienes que ver dependiendo de la necesidad que componente utilizar, ya eso queda de tu parte pero te recomiendo que utilices HashSet si no quieres almacenar objetos repetidos, si eso no importa deberías utilizar HashMap ya que el HashSet es solo un
wrapperUna clase wrapper es una clase que encapsula tipos de datos, de modo que esos tipos de datos pueden utilizarte para crear instancias en otra clase que necesita los mismos, en este caso HashSet utiliza internamente HashMap.
de HashMap. Recuerda comentar si necesitas que agregue algo más a esta entrada o si tienes alguna duda.

Suerte!!

4/8/16

Diferencia entre HashMap y Hashtable Java.

Diferencia entre HashMap y Hashtable en Java.

Diferencia entre HashMap y Hashtable en Java




Seguimos con preguntas de entrevistas, hay que recordar que la oportunidad que estás buscando puede que sea la entrevista que tienes mañana, lo que quiere decir que probablemente estas preparándote y quieres que todo salga bien, pero una pregunta tan sencilla como esta puede dejarte de lado si no sabes responderla con la seguridad de que sabes que lo que dices es cierto.
Estas dos estructuras de datos son muy similares, pero también tienen algunas diferencias muy notables, haciendo una breve introducción, los dos son estructuras de datos muy usados en el Collection framework.

Te puede interesar: Que es un HashMap y como funciona.

Diferencias:
  • El HashMap solo permite un null key y cualquier cantidad de null values, en cambio un Hashtable no permite ningún null ya sea en key o en value.

20/7/16

Que es un HashMap y cómo funciona

Que es un HashMap y cómo funciona.

Que es un HashMap y cómo funciona.




Pregunta fija para una entrevista, a veces trabajamos con HashMap pero no sabemos en realidad el concepto del mismo y menos como funciona internamente. Un HashMap es la implementación de la interface Map, esta interface es un tipo de
CollectionUna Collection es una interface que agrupa un conjunto de elementos.
que almacena datos asociando una
llave a un valorMap<key, value>. key= la llave. value= String, Integer, Boolean...
, esta interface sirve para muchas cosas y tiene ciertas caracteristicas que la definen, por ejemplo, no permite key duplicados, cada key tiene que estar asociado a un valor como máximo, si agregas un key que ya existe sobrescribe el valor del key anterior, solo permite Object types lo que quiere decir que no puedes poner un valor primitivo...
Volviendo al tema casi siempre se utiliza el HashMap como implementación del Map pero tiene sus cosas, por ejemplo, no garantiza que los elementos que vamos agregando estén ordenados, no deberíamos usarla en aplicaciones multithread porque no es synchronized, pero como todo en el mundo de Java, esto se puede lograr con unas líneas de código.

El HashMap funciona con el
principio del hashingEl principio se basa en asignar una ubicación para cierta key, dependiendo de una key determinada se le asigna un id único, en este caso se utiliza el método hashCode() el cual heredan todos los objetos en Java, algo importante de resaltar es que un objeto solo retornara un id, lo que quiere decir que si invocamos el hashcode con otro objeto idéntico devolverá el mismo id.
, como ya explique trabaja asignando una ubicación a una key con el método hashCode() de Java.

Comenzando desde el principio, así podemos crear un HashMap:
  // Un HashMap simple de llave String y valor Integer.
     HashMap<String, Integer> hashMapEdad = new HashMap<String, Integer>();
    
El constructor del HashMap que invocamos automáticamente le asigna

23/11/15

JLabel gradient background.

JLabel gradient background.

Realizar JLabel con color de fondo gradiente.




Algo que se ve muy bien en las aplicaciones de escritorio en Java, son los titulos con un color de fondo gradiente (JLabel Gradient Background), para hacerlo solo hay que sobreescribir el metodo void paintComponent(Graphics g) de la clase JComponent, recuerda que esta es la clase base para los componentes SWING.
Para lograr un color de fondo gradiente horizontal:
JLabel gradient background horizontal
JLabel Gradiente
Hay que implementar este codigo:
  JLabel label = new JLabel("...... DatoJava ......") {
   @Override
   protected void paintComponent(Graphics g) {
    Color colorFinal = new Color(255, 1, 1);
    
    Graphics2D graphics2d = (Graphics2D) g.create();
    graphics2d.setPaint(new GradientPaint(0, 0, getBackground(),
      getWidth(), 0, colorFinal));
    graphics2d.fillRect(0, 0, getWidth(), getHeight());
    graphics2d.dispose();
    
    super.paintComponent(g);
   }
  };
    
Para lograr un color de fondo gradiente vertical:
JLabel gradient background Vertical
JLabel Gradiente
Hay que implementar este codigo:
  JLabel label = new JLabel("...... DatoJava ......") {
   @Override
   public void setForeground(Color fg) {
    super.setForeground(fg.RED);
   }

   @Override
   protected void paintComponent(Graphics g) {
    LinearGradientPaint linearGradientPaint = new LinearGradientPaint(
      new Point(0, 10), new Point(0, getHeight()),
      new float[] { 0.240f, 0.250f }, new Color[] {
        Color.LIGHT_GRAY, Color.GRAY });

    Graphics2D graphics2d = (Graphics2D) g.create();
    graphics2d.setPaint(linearGradientPaint);
    graphics2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
    graphics2d.dispose();

    super.paintComponent(g);
   }
  };
    
Con esto podemos jugar y hacer varias cosas interesantes, por ejemplo:
JLabel gradient background Esquina
JLabel Esquina Gradiente
  JLabel label = new JLabel("...... DatoJava ......") {
   @Override
   protected void paintComponent(Graphics g) {
    LinearGradientPaint linearGradientPaint = new LinearGradientPaint(
      new Point(0, 10), new Point(10, getHeight()),
      new float[] { 0.240f, 0.250f }, new Color[] {
        Color.BLACK, getBackground() });

    Graphics2D graphics2d = (Graphics2D) g.create();
    graphics2d.setPaint(linearGradientPaint);
    graphics2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
    graphics2d.dispose();

    super.paintComponent(g);
   }
  };
    
JLabel gradient background Linea abajo
JLabel Linea Abajo
  JLabel label = new JLabel("...... DatoJava ......") {
   @Override
   protected void paintComponent(Graphics g) {
    LinearGradientPaint linearGradientPaint = new LinearGradientPaint(
      new Point(0, 25), new Point(0, getHeight()),
      new float[] { 0.240f, 0.250f }, new Color[] {
        getBackground(), Color.RED });

    Graphics2D graphics2d = (Graphics2D) g.create();
    graphics2d.setPaint(linearGradientPaint);
    graphics2d.fill(new Rectangle(0, 0, getWidth(), getHeight()));
    graphics2d.dispose();

    super.paintComponent(g);
   }
  };
    
JLabel gradient background linea abajo gradiente
JLabel Linea Abajo
  JLabel label = new JLabel("...... DatoJava ......") {
   @Override
   protected void paintComponent(Graphics g) {
    Color colorFinal = new Color(0, 0, 0);
    Graphics2D graphics2d = (Graphics2D) g.create();
    graphics2d.setPaint(new GradientPaint(0, 0, getBackground(),
      getWidth(), 0, colorFinal));
    graphics2d.fillRect(0, 25, getWidth(), getHeight());
    graphics2d.dispose();

    super.paintComponent(g);
   }
  };
    

20/11/15

JCalendar Java Swing Tutorial.

JCalendar Java Swing Tutorial

Tutorial del JCalendar con ejemplos, Java Swing.




JUnit Assume Tutorial. Que mejor manera de controlar la fecha que un usuario ingresa que con un calendario en donde con un simple clic ya obtengamos Año, Mes y Día, en Java Swing no trae por defecto un componente que facilite este comportamiento, así que por eso hay que descargar una librería externa llamada JCalendar, dicha librería tiene varias funcionalidades, podemos elegir desde un calendario la fecha completa, la fecha de hoy, elegir una fecha maxima o minima para seleccionar, elegir solo un día, año o mes... En fin en este Tutorial de JCalendar vamos hacer varios ejemplos con las funcionalidades que ofrece utilizando el IDE JBoss Developer Studio o eclipse.