Cómo añadir un icono corporativo a una aplicación java y cambiar el icono por defecto de java

Hemos hecho  nuestra aplicación Java. Pero! en la esquina superior derecha y en la barra de programas ejecutándose tenemos el símbolo de Java.


¿Cómo añadimos el icono corporativo de la aplicación y cambiamos el icono por defecto de java?

Tenemos que ir al mismo Main de la aplicación, donde invocamos el JFrame.

Imaginemos que tenemos el Menú definido así.:

public class Menu extends javax.swing.JFrame{
}

Para incorporar el icono y el título

//Ponemos un icono a la aplicación
URL pathIcon = this.getClass().getClassLoader().getResource("openstreetmapexample/icon/earth.png");
Toolkit kit = Toolkit.getDefaultToolkit();
Image img = kit.createImage(pathIcon);
menu.setIconImage(img);
// Aprovechamos para ponerle el nombre de la aplicación
menu.setTitle("StreetFinder");

En stackOverFlow.com, no conseguí obtener la respuesta correcta. Todas las soluciones derivaban respecto a cómo obtener la url del icono. Por si queda alguna duda. Voy a mostrar una captura de dónde está el icono dentro del proyecto.

 

Y por fín el resultado!!

Error al crear icono de escritorio desde el jnlp Java

La situación: Al ejecutar el jnlp, se auto-creaba un icono en el escritorio.
Ahora: En actualizaciones se borra el icono y/o al descargarlo e instalarlo también.
Solución encontrada: Desinstalar la versión 7 de java. Volver a ejecutar el jnlp y comprobar que arranca con la versión 6 de java. Así, funciona.

Este error que no he conseguido solucionar por ahora y que al equipo de desarrollo nos está llevado más de un quebradero de cabeza, se ha tomado la postura cómoda de pensar que el error es de java 7. Posiblemente habrán cambiado alguna opción de configuración del jnlp o algo se está haciendo mal pero es muy extraño que el mismo jnlp, tras la actualización de java 7, no funcione correctamente.

No he encontrado ni en blogs,  google, ni las páginas oficiales de Oracle una solución mejor.

Al menos es una solución… Se agradece cualquier comentario o ayuda!

Cómo iniciar e interpretar el visor de Caché de Java

Muchos desconocen el visor de caché de java o nunca lo han utilizado. Recomiendo su utilización por los siguientes motivos:

  • Podemos ver todas las aplicaciones descargadas.
  • Podemos ver si están activadas las actualizaciones automáticas
  • Podemos actualizar la versión del java
  • Podemos configurar los parámetros de java de nuestro ordenador.
  • Podemos visualizar el jnlp

Y esto para qué es útil?

En mi caso, estoy desplegando una aplicación a distintas máquinas. Cada aplicación tiene una configuración distinta.  Para realizar las pruebas finales, estoy instalando en mi ordenador la aplicación que he desplegado en su servidor  (por VPN) en mi escritorio.

Cuando sólo tenemos una, es útil para saber si nos ha pillado bien el vpn o las conexiones automáticas activadas o desactivadas. Pero cuando queremos controlar más de una aplicación con el mismo nombre es útil saber a qué máquina apunta, qué conexión tiene, etc. Ya que sino… puede ser un caos total!!

En windows:

Abrir el programa «ejecutar»

Escribir

javaws -viewer

Cuando tengamos la consola podremos ver las aplicaciones activas:

Estado: Si el estado está en verde la aplicación se actualizará automáticamente.

Desinstalar: si pulsamos con el botón derecho podemos seleccionar la opción de desinstalar.

Botón verde superior ejecutar: arranca la aplicación que estás seleccionando en el menú.

En MAC o Linux, si tenemos configurado Java desde el PATH, simplemente hay que ejecutar el comando javaws -viewer desde el terminal.

Cómo hacer que una aplicación java se actualice al arrancar en el .jnlp

Esto que parece muy sencillo, puede llevar muchos quebraderos de cabeza.

Bien!! Empecemos!!!

Tenemos nuestro .jnlp desplegado en el lugar donde lo hemos instalado.
Las palabras mágicas para que se actualice es poner :

<shortcut online="false">
          <desktop/>
          <menu submenu="AsisT"/>
        </shortcut>
&nbsp;

De esta forma cuando se haga dobleclik en el icono del escritorio, se actualizarán los cambios del jnlp.

Para entenderlo mejor, adjunto la estructura del jnlp.

<jnlp spec="1.5+" codebase="http://192.168.X.X/" href="http://192.168.X.X/eljnlp.jnlp>

 <information>
        <title>AsisT - DEMO</title>
        <vendor>Ibernex SL</vendor>
        <icon href="images/icono.png"/>
        <shortcut online="false">
          <desktop/>
          <menu submenu="AsisT"/>
        </shortcut>
    </information>
 <security>
      <all-permissions/>
    </security>
  <resources>
...
  </resources>
</jnlp>

Cómo utilizar el patrón de diseño Factory en un caso de ladrones de un país. Fácil y sencillo como la vida misma

Imaginemos aleatoriamente y usando la imaginación que existe un país llamado «OtrasDesvirtudes».

En este país roban los banqueros, los políticos, los jueces y miembros de la real-desvirutd. El gobierno-desvirtud ha hecho una aplicación  (encargada al hijo del dirigente) para que puedan robar(); Los usuarios se autentifican y aparece un botón enorme «ROBAR A LOS PRINGADOS DE SIEMPRE QUE PAGAN DIGNAMENTE SUS IMPUESTOS».

Lo que pasa! que cada uno en función de su puesto, roba de diferente forma:

– Los banqueros (altos dirigentes): piden rescate monetario para hacerse unas pensiones vitalicias de cifras orbitales para finalmente, declarar suspensión de pagos.

– Los políticos: Se quedan comisiones por asignaciones de obra, rectificar terrenos y viajes inexistentes.

– Los jueces: sobornos y viajes inexistentes.

– La real-desvirtud: crea empresas que no existen para recibir subvenciones.

Caos!!! tenemos distintos robos para distintas personas!! cómo lo haremos de forma transparente!! de forma que sea sólo «robar» y que cada uno se las apañe como mejor pueda robar.

La persona que hace la aplicación letal, se le ocurre la brillante idea, de aparte cobrarles más por facinerosos, contratar a su «amigo informático» para que le haga la aplicación de gratis.

El «amigo informático» dados sus conocimientos letales utilizar el patrón de diseño Factory. La idea aplicada a Java, sería de la siguiente forma:

Una clase abstracta RobarFactory().

public abstract class RobarFactory {

    private static int defaultFactoryType = 1;

    public static final int BANQUERO = 1;

    public static final int POLITICO = 2;

    public static final int JUEZ = 3;

    public static final int REAL-DESVIRTUD = 4;



    /**

     * Establece el tipo de factoria por defecto

     * @param type Tipo de factoria de los aceptados

     */

    public static void setDefaultFactoryType(int type){

        defaultFactoryType = type;

    }


    /**

     * Devuelve el Factory adecuado para el tipo establecido por defecto

     * @return Factory del tipo establecido

     * @throws Exception

     */

    public static RobarFactory getRobarFactoryDefault() throws Exception{

        return getRobarFactory(RobarFactoryType);

    }


    /**

     * Devuelve el Factory para el tipo indicado en el parametro type

     * @param type Tipo de Factory a utilizar

     * @return Factory del tipo indicado

     * @throws Exception

     */

    public static RobarFactory getRobarFactory(int type) throws Exception{

        DAOFactory factory = null;

        switch(type){

            case RobarFactory.BANQUERO

                factory = new BANQUEROFactory();

                break;

            case RobarFactory.POLITICO

                factory = new POLITICOFactory();

                break;

                

            default:

                throw new TAsistoException(«ERR-0003», «No existe una factoria para el indicado: » + type);

        }

        return factory;

    }

    


    //metodos abstractos que todas las factorias deberán implementarlos

    /**

     * Devuelve el Dinero robado

     * @return Dinero robado

     */

    public abstract Dinero robar();

Ya tenemos la factoría hecha. ¿Dudas? Con lo fácil que es robar!

Cuando se autentifican se pone setFactoryDeflautType al tipo de la persona y devolveremos su factoria con getRobarFactory(). Porque ojo! todos roban de diferente forma. Por ejemplo: se autentifica el político, se pone setFactoryDeflautType a 1 y se cargará su factoría POLITICOFactory()

Pero su función no es robar(); es robarPolítico(); lo que pasa que queremos que en la aplicación aparezca un sólo robar(), ya que el objetivo es que se unan más miembros (factorías) en el futuro y que se añadan nuevas funciones propias como estafar(), defraudarHacienda(), etc.

Así que implementamos las funciones abstractas, en este caso, robar()

/**

 *

 * @author llacarra

 */

public class POLITICOSFactory extends RobarFactory {


    /**

     * Devuelve el Robar para trabajar con usuario en una base de datos Mysql

     * @return Dinero robado

     */

   @Override

    public Dinero robar(){

        return new robarPolitico();

    }

   

   @Override

    public Dinero estafar(){

        return new estafarPolitico();

    }

Así una factoría con sus funciones por cada miembro ladrón del país. 

De esta forma. El amigo informático ha conseguido que la aplicación llame a un sólo «robar()» y que por medio de la factoría abstraiga la lógica de la función. En algún sitio, deberá estar implementada la función de estafarPolitico(), o en esta misma clase puede estar la función desarrollada.

Se puede hacer que desde la misma base de datos cargue esa configuración, de forma que dependa menos de la aplicación.

Así da igual que miembro del país acceda… que robará igualmente, fácilmente, e independientemente de su puesto.  Bravo, bravísimo!!!