Cursor personalizado

Aquí voy a explicar un ejemplo de como a grandes rasgos se puede poner una imagen personalizada como cursor en una aplacación java. La manera de hacerlo soporta imagenes convencionales, como JPG, PNG, GIFT, BMP.

Lo primero es obtener el Toolkit. Ya sea que estemos usando la clase default de AWT o motif. Etc.

Toolkit toolkit = Toolkit.getDefaultToolkit();

Se carga la imagen que quieras como puntero, esta variable es procesada en un objeto de tipo Image.

Image image = toolkit.getImage(mi_imagen.png"));

Se crea el punto de interacción del puntero, es decir, qué área del puntero será la encargada de dará “clic”. Si el puntero fuera una cruz entonces el punto de interaccion sería el centro de la cruz.

Point hotSpot = new Point(0, 0);

Para finalizar se crea el cursor, y se estable el mismo a la aplicación

Cursor cursor = toolkit.createCustomCursor(image, hotSpot, "un_nombre");
setCursor(cursor);

17 comments

  1. que buen codigo pero esta clase solo permite .png
    y los gif no??

  2. Hola @felipe,

    también se puede usar gif, bmt y jpg. Si necesitas usar otro tipo de extensión necesitas crear un objeto Image y convertir la imagen es una extencion aceptada.

    pura vida

  3. Me funcionó perfectamente. ¡Gracias!

  4. Buenas tardes, al realizar estos cambios si ejecutamos el proyecto desde NetBeans (por ejemplo) sí funcionan, pero cuando ejecuto directamente el archivo jar generado, el cursor no aparece, así como también me pasa con el logo del jFrame y no entiendo por qué, ya que he importado la imagen en cuestión al proyecto y si abro el jar con Winrar la imagen está dentro.

    Agradecería muchísimo vuestra ayuda, puesto que me he quedado aquí y mi nuevo software está a punto de dar a luz.

    Un saludo.

    Fran.

  5. Éste es el código (en el constructor del JFrame):

    Toolkit toolkit = Toolkit.getDefaultToolkit();

    Image image = toolkit.getImage(“logo.png”);

    Point hotSpot = new Point(16, 0);

    cursor = toolkit.createCustomCursor(image, hotSpot, “cursorSIR”);

    setCursor(cursor);
    setIconImage((new javax.swing.ImageIcon(image).getImage()));

  6. Hola @Fran,

    En caso de que vayas a usar tu proyecto en otra maquina, es decir, que sea de alguna manera una aplicacion movil… es importante que te refieras a las imagenes de modo relativo a la carpeta de tu proyecto, ejemplo:

    path a tu proyecto:
    C:/proyectos/java/pro1/

    path a las imagenes del proyecto:
    C:/proyectos/java/pro1/imagenes

    Intenta acceder a las imágenes de un modo relativo:

    Image image = toolkit.getImage(getClass().getResource(”imagenes/logo.png”));

    Ya me contaras como te fue.

  7. ¡Fantástico!

    Muchas gracias por tu ayuda, había probado métodos semejantes pero ninguno de ellos daba resultado.

    Tu ayuda ha sido de gran utilidad.

    Un saludo.

  8. Por cierto, …

    ¿Sabes implementar una JProgressBar? He visto varios ejemplos, pero cuando los aplico a mi programa algún evento o algo parecido no debe funcionar bien, debido a que la barra únicamente aparece cuando ya se ha realizado hasta el 100% del proceso y entonces se dibuja toda entera, sin ver el progreso.

    Es usado en una pantalla que lo que hace es cargarse y tiene un método para rellenar una tabla con datos desde la base de datos y lo que quiero es que se cargue la pantalla y mientras se va rellenando la tabla que aparezca una barra de porcentaje completado, debido a que ahora es rápida la ejecución porque únicamente posee unos 25 registros, pero me da miedo pensar en cuando tenga que cargar 500 …

  9. @Fran,

    que bueno que te haya servido… ahora bien, intenta algo asi:

    boton.addActionListener (new ActionPerformed()
    {
    public void actionPerformed (ActionEvent e)
    {
    Runnable miRunnable = new Runnable()
    {
    public void run()
    {
    barraProgreso.setVisible(true);
    barraProgreso.setValor(0);
    try
    {
    System.out.println(“Me han pulsado”);
    primerPasoTarea();
    barraProgreso.setValor(33); // Al 33%
    segundoPasoTarea();
    barraProgreso.setValor(66); // Al 66%
    ultimoPasoTarea();
    barraProgreso.setValor(100); // Al 100%
    System.out.println(“Terminé);
    barraProgreso.setVisible(false);
    }
    catch (Exception e)
    {
    e.printStackTrace();
    }
    }
    }
    Thread hilo = new Thread (miRunnable);
    hilo.start();
    }
    });

  10. Hola, no me he explicado bien.

    En el constructor de mi pantalla llamo a un método privado de la clase que rellena la tabla:

    private void omplirGraellaResultats() {
    int i = 0;

    for (String[] info : host) {
    modelGraella.addRow(info);
    modelGraella.setValueAt(info[0], i, 0);
    modelGraella.setValueAt(info[2] + ” ” + info[3] + “, ” + info[4], i, 1);
    i++;
    }
    this.etiquetaNumHostesses();
    }

    Creo que es aquí donde debería añadir un listener o algo parecido para que la barra se actualizase. Creo que la opción adecuada es declarar la JProgressBar como atributo de la clase y hacer el new() dentro de este método, así como la actualización de los datos, pero ando bastante perdido, ya que creo que me falta el punto de que cada vez que se añada una fila se actualice la JProgressBar, debido a que he conseguido únicamente que se vea vacía del todo y llena del todo al terminar la carga.

    Gracias por tu ayuda.

  11. @Fran, por que no intentas algo como esto:


    private void omplirGraellaResultats() {

    Runnable miRunnable = new Runnable(){

    public void run(){
    barraProgreso.setVisible(true);
    barraProgreso.setValue(0);
    barraProgreso.setMaximum(host.size());

    try{

    int i = 0;

    for (String[] info : host) {
    modelGraella.addRow(info);
    modelGraella.setValueAt(info[0], i, 0);
    modelGraella.setValueAt(info[2] + " " + info[3] + ", " + info[4], i, 1);
    barraProgreso.setValue(i);
    miRunnable.sleep(1000);
    i++;
    }
    this.etiquetaNumHostesses();

    }
    catch (Exception e){
    e.printStackTrace();
    }
    }
    }

    Thread hilo = new Thread (miRunnable);
    hilo.start();
    }

    No pude probarlo, pero creo que deberia funcionar.

    Un saludo.

  12. No se ve la barra de progreso :(

    La declaro como abributo de clase:
    private JProgressBar barraProgreso;

    La inicializo en el constructor:
    barraProgreso = new JProgressBar();

    // La incluyo en el desktopPane.
    principal.add(barraProgreso);

    el programa tarda más debido al sleep del hilo, pero no se ve la barra ni su progreso :’(

    Gracias por tu ayuda, estás siendo de gran utilidad.

  13. Todo solucionado, únicamente me faltaría poder mostrar en la barra el porcentaje completado. Existe el método getPercentComplete() pero no sé como hacer para que se dibuje en la barra.

    La actualización del porcentaje está clara, pero no sé como dibujarlo en la barra.

    Gracias por tu ayuda.

  14. Despues de que le asignas el valor a la barra de progreso trata de repitar de nuevo el componente padre, algo asi
    this.repaint();

    En cuanto al metodo getPercentComplete() puedes ir comparando el valor actual contra el 100% (que es el maximo), una vez alcanzado pues ya puedes ejecutar la siguiente tarea

    Y para pintar el porcentage en la barra usa el siguiente metodo:
    barraProgreso.setStringPainted(true);

    Ya me contaras como te fue. Pura vida

  15. :P Gracias por todo ;)

  16. Perdon… de donde debo meterme para encontrar el codigo? :D

Leave a Reply